我有两个主题。在他们每个人中我都在运行一个调度程序。
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()
调用,它立即返回值。如何才能在返回之前等待线程?
我们将不胜感激。
答案 0 :(得分:5)
假设scheduler
和timeChecker
为ScheduledExecutorService
,您的代码正在做它应该做的事情。
schedule
和scheduleAtFixedRate
都是异步的,因为他们计划在将来的某个时间在单独的线程上完成工作。他们俩立刻回来了。
你的两个主题one
和two
在这里毫无意义。您似乎希望从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}}返回。
否则,任务将仅通过取消或终止 终止执行人。