我的 java 应用程序有一个加载任务,它需要两个可以并行化的服务器调用。所以我启动了一个 Thread t1 (执行task1)和一个 Thread t2 (用于task2)。然后,我想在其他两个任务(1 和 2)都结束时执行特定任务task3 。自然我不知道task1和task2中的哪一个会先完成......
哪种方法对您来说是最简单(也是最安全)的编码方式?
感谢您的帮助
我的 java 应用程序有一个加载任务,它需要两个可以并行化的服务器调用。所以我启动了一个 Thread t1 (执行task1)和一个 Thread t2 (用于task2)。然后,我想在其他两个任务(1 和 2)都结束时执行特定任务task3 。自然我不知道task1和task2中的哪一个会先完成......
哪种方法对您来说是最简单(也是最安全)的编码方式?
感谢您的帮助
你有几个选择:
您可以join
同时使用t1
and t2
(以任一顺序),然后在加入后运行 task3。
在您的 task3 中实现一个监听器接口,并将其注册到 task1 和 task2。Task1 和 Task2 必须在结束前调用它们的监听器。这样做,您可以在 task3 中记录哪个任务已经完成,当两者都完成时,您可以执行第三个任务。
当然,如果你的 task1/2 中的一个可以异常退出,别忘了把 task3 作为它的 UncaughtExceptionHandler
我不想在 2 个工作线程(task1 和 task2)完成工作时终止它们,那么您可以在 task3 中等待一个条件,直到另外两个完成。像这样的东西:
public class Master {
private Object monitor_ = new Object();
private boolean task1Finished_;
private boolean task2Finished_;
class Task1 extends Thread {
public void run() {
// do stuff
synchronized (monitor_) {
task1Finished_ = true;
monitor_.notifyAll();
}
// keep on working
}
}
class Task2 extends Thread {
public void run() {
// do stuff
synchronized (monitor_) {
task1Finished_ = true;
monitor_.notifyAll();
}
// keep on working
}
}
class Task3 extends Thread {
public void run() {
synchronized (monitor_) {
while (!task1Finished_ || !task2Finished_) {
try {
monitor_.wait();
}
catch (InterruptedException ignored) {
}
}
}
// do stuff
}
}
// start tasks1, task2 and task3...
}