我有以下代码
public static void main(String[] args) {
new Thread() {
public void run() {
try {
employee1();
} catch (Exception e) {
Logger.LogServer(e);
}
finally {
Logger.LogServer("empployee1 records inserted");
}
}
}.start();
new Thread() {
public void run() {
try {
employee2();
} catch (Exception e) {
Logger.LogServer(e);
}
finally {
Logger.LogServer("employee2 records inserted");
}
}
}.start();
}
我想等待两个步骤完成执行,然后使用System.exit(0);
退出应用程序。我怎样才能做到这一点?
有人可以帮助我。
答案 0 :(得分:4)
您需要在两个线程上使用join()
。
join 方法允许一个线程等待另一个线程的完成。如果t是其线程当前正在执行的Thread对象,
t.join()
导致当前线程暂停执行,直到线程终止。
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
...
}
};
Thread t2 = new Thread() {
public void run() {
...
}
};
t1.start();
t2.start();
t1.join();
t2.join();
}
答案 1 :(得分:1)
Thread t1 = ...
Thread t2 = ...
t1.join();
t2.join();
System.exit(0);
您需要捕获InterruptedException或将main标记为抛出它。
答案 2 :(得分:0)
您可以使用.join()来阻止线程执行完毕。
Thread t = new Thread() {
public void run() {
try {
employee1();
} catch (Exception e) {
Logger.LogServer(e);
}
finally {
Logger.LogServer("empployee1 records inserted");
}
}
}.start();
Thread t2 = new Thread() {
public void run() {
try {
employee2();
} catch (Exception e) {
Logger.LogServer(e);
}
finally {
Logger.LogServer("employee2 records inserted");
}
}
}.start();
t.join();t2.join();
System.exit(0);
答案 3 :(得分:0)
如果要终止流使用System.exit(0)
或
您可以简单地在某处保留对所有线程的引用(如列表),然后再使用引用。
List<Thread> appThreads = new ArrayList<Thread>();
每次你开始一个帖子:
Thread thread = new Thread(new MyRunnable()); appThreads.add(螺纹); 然后当你想要终止信号时(不是通过停止我希望:D)你可以轻松访问你创建的线程。
您也可以使用ExecutorService并在不再需要时调用shutdown:
ExecutorService exec = Executors.newFixedThreadPool(10);
...
exec.submit(new MyRunnable());
...
exec.shutdown();
这是更好的,因为你不应该为你想要执行的每个任务创建一个新线程,除非它长时间运行I / O或类似的东西。
答案 4 :(得分:0)
请注意,您不应直接创建线程。使用ExecutorService
启动异步任务:
ExecutorService executor = Executors.newFixedThreadPoolExecutor(4);
executor.submit(() -> employee1());
executor.submit(() -> employee2());
executor.shutdown();
executor.awaitTermination(timeout, TimeUnit.MILLISECONDS);
// all tasks are finished now