2014-09-22 138 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