为什么当前Thread在返回值之前不等待其他Threads?

时间:2015-06-03 14:37:30

标签: java multithreading

我有两个主题。在他们每个人中我都在运行一个调度程序。

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()调用,它立即返回值。如何才能在返回之前等待线程?

我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

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

schedulescheduleAtFixedRate都是异步的,因为他们计划在将来的某个时间在单独的线程上完成工作。他们俩立刻回来了。

你的两个主题onetwo在这里毫无意义。您似乎希望从ScheduledFuture来电中获取schedule并致电get

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

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

第一次执行完成后,schedule调用返回的ScheduledFuture将从get返回。

ScheduledFuture调用所返回的get只有在ScheduledExecutorService被取消或{{1}}被终止时才会从{{1}}返回。

  

否则,任务将仅通过取消或终止   终止执行人。