2015-06-03 71 views
3

我有两个线程。在他们每个人中,我正在运行一个调度程序。为什么当前线程在返回值之前没有等待其他线程?

Thread one = new Thread(
    () -> scheduler.scheduleAtFixedRate(eventMaker, 0, 1, MICROSECONDS) 
); 

Thread two = new Thread(
    () -> timeChecker.schedule(timeAnalyser, 1, TimeUnit.SECONDS) 
); 

然后,我开始他们并调用它们join()作出方法,其中,它们被初始化,等他们返回的返回值之前完成。

threads = new Thread[2]; 
threads[0] = one; 
threads[1] = two; 

for (int i = 0; i < threads.length; i++) { 
    threads[i].start(); 
} 

for (int i = 0; i < threads.length; i++) { 
    threads[i].join(); 
} 

return a; 

但仍然调用它们的方法不会等待它们。即使调用join(),它立即返回值。如何在返回之前等待线程?

您的帮助,将不胜感激。

回答

5

假设schedulertimeCheckerScheduledExecutorService s,您的代码正在做它应该做的事情。

schedulescheduleAtFixedRate都是异步的,因为它们会在未来的某个时间在单独的线程上安排工作。他们两人立即返回。

你的两条线程onetwo,在这里是没有意义的。您似乎想要从schedule呼叫中获得ScheduledFuture,并呼叫get

ScheduledFuture<?> schedulerFuture = scheduler.scheduleAtFixedRate(eventMaker, 0, 1, MICROSECONDS); 
ScheduledFuture<?> timerFuture = timeChecker.schedule(timeAnalyser, 1, TimeUnit.SECONDS); 

schedulerFuture.get(); 
timerFuture.get(); 

ScheduledFuture返回调用schedule将从get返回一旦第一个执行完毕。

ScheduledFuture返回调用scheduleAtFixedRate将从get返回,只有当它被取消,或者如果ScheduledExecutorService被终止。

否则,任务只会通过取消或终止执行程序终止 而终止。

+0

因此,如何才能使用这些'get'方法来实现方法在调度程序完成后立即返回值? – testiguy

+0

我现在通过在'return'之前加入'while(!timerFuture.isDone()){}'来解决它,但我想那不是一个好习惯。我怎样才能更好地解决这个问题? – testiguy

+0

@testiguy你的意思是什么?一旦调度员完成了_?对于调用'schedule',因为它只会执行一次,所以使用'get'。它阻塞线程直到任务完成。对于'scheduleAtFixedRate',任务重复,所以没有“完成”。 –

相关问题