2014-09-22 137 views
0

我有一個類,它使用executor服務來同時運行任務。等待執行程序服務線程

代碼:

class SomeClass{ 
private static ExecutorService taskThread = Executors.newFixedThreadPool(1, new ThreadFactory() { 
     private int threadCount = 0; 

     @Override 
     public Thread newThread(Runnable r) { 
      Thread t = new Thread(r); 
      t.setDaemon(true); 
      return t; 
     } 
    }); 

    static { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       taskThread.shutdown(); 
      } 
     }); 
    } 


doSomeTask() 
{ 
      DocumentUploader callable = new DocumentUploader(randomID,fileLoc);   
      FutureTask<String> task1 = new FutureTask<String>(callable); 
      taskThread.execute(task1); 
} 


someFunctionforWait(){ 


//what here..??? 
} 

我還有一個類名SomeOtherClass將訪問由task1線程完成的修改/計算。所以我需要等待線程完成,那麼我如何等待task1完成。我打算做的是致電SomeOtherClasssomeFunctionforWait()檢查線程是否已完成,然後開始執行任務。

我該怎麼做。

+0

ExecutorService的關機和awaitTermination – emsworth 2014-09-22 18:06:34

+0

請你ellaborate更多..?我應該在那裏把這些sumFunctionWait()..? @emsworth – stupidosaur 2014-09-22 18:08:22

回答

0

創建FuturetaskThread並調用get()就可以了。它會阻止,直到Future完成:

Future<String> f = taskThread.submit(callable); // concurrent operation 
String result = f.get(); // blocks until f completes 
// use result 
1

你可以使用期貨,或者如果你想堅持使用ExecutorService的,只是等待taskThread.shutdown()和taskThread.awaitTermination();你可以把這些語句放到你的someFunctionforWait()中,然後繼續執行。這是基於你的代碼一個簡單的例子:

public class SomeClass { 
    private ExecutorService taskThread = Executors.newFixedThreadPool(1); 
    private List<Future<String>> futures = new ArrayList<Future<String>>(); 
    void doSomeTask() { 
     FutureTask<String> task1 = new FutureTask<String>(new Callable<String>() { 
      public String call() throws Exception { 
       System.out.println("thread executing"); 
       Thread.sleep(1000); 
       return Thread.currentThread().toString(); 
      } 
     }); 
     taskThread.execute(task1); 
     futures.add(task1); 
    }; 

    public void someFunctionforWait() throws InterruptedException, ExecutionException{ 
     taskThread.shutdown(); 
     taskThread.awaitTermination(5, TimeUnit.SECONDS); 
     System.out.println("joined"); 
    } 

    public void someFunctionforWaitAlternative() throws InterruptedException, ExecutionException{ 
     for(Future<String> future : futures) { 
      System.out.println("future val: " + future.get()); 
     } 
     System.out.println("joined"); 
    } 

    public static void main(String[] args) throws Exception { 
     SomeClass c = new SomeClass(); 
     c.doSomeTask(); 
     c.someFunctionforWait(); 
     //c.someFunctionforWaitAlternative(); 
    } 
} 
+0

someFunctionforWait永遠不會給你可Callable的結果 – 2014-09-22 19:41:30

+0

@Jean Logeart它不一定非得 - 它在原始問題中沒有真正指定。但你是對的,這是兩者之間的差異。如果您想使用Runnable/shutdown/awaitTermination存儲結果,則需要一個線程安全機制來存儲執行結果。 – emsworth 2014-09-22 19:47:46