2017-07-06 52 views
-1

我已經向ExecutorService提交了兩項任務task1 & task2。任務2需要5秒才能完成,而任務1需要10秒。如何取消ExecutorService上的不完整任務

當task2完成並繼續邏輯的其餘部分時,如何停止提交的任務(即:task1)?

這裏是我到目前爲止的代碼:

public class mt_poc { 
    public static void action_1() throws InterruptedException { 
     System.out.println("action_1 invoke "); 
     Thread.sleep(10000); 
     action_2(); 
     System.out.println("action_1 done"); 
    } 

    public static void action_2() throws InterruptedException { 
     System.out.println("action_2 invoke "); 
     Thread.sleep(5000); 
     System.out.println("action_2 done "); 
    } 

    public static void main(String[] args) {      
     System.out.println("TEST");   
     Runnable task1 = new Runnable() { 
      public void run() { 
       try { 
        action_1(); 
       } 
       catch(InterruptedException e) { 
        System.out.println("action_1 invoke interrupted"); 
       } 
       System.out.println("action_1 invoke run is over"); 
       } 
      }; 

     Runnable task2 = new Runnable() { 
      public void run() { 
       try { 
        action_2(); 
       } 
       catch(InterruptedException e) { 
        System.out.println("action_2 invoke interrupted"); 
       } 
       System.out.println("action_2 invoke run is over"); 
       } 
      };   

     ExecutorService executor = Executors.newFixedThreadPool(2); 

     try { 
      executor.submit(task1); 
      executor.submit(task2); 
      // cancel uncomplete task 
      executor.shutdown(); 
      executor.awaitTermination(5, TimeUnit.SECONDS); 
      // continues the rest of logic 
     } catch (InterruptedException e) { 
       e.printStackTrace(); 
     } 

     System.out.println("Shutdown executor"); 
    } 
} 

回答

0

你必須檢索來自submit功能Future對象之前完成。
這些用於控制正在運行的線程並獲取它的狀態。 如果您有期貨,請撥打Future2.get()。這將阻止該線程,直到Task2完成。不,您可以使用Future1.cancel(true)來中止另一個線程。

但暫停和恢復是不可能的。見Java ExecutorService pause/resume a specific thread

如果你想要這種特定的行爲,你需要使用線程。

但是,爲什麼你要在單獨的線程中做到這一點,因爲它會更簡單和高效的使用單個線程。