我想从主线程运行一个线程,但我希望此线程在主线程完成后执行。 我该怎么做? 我可以通过线程引用主线程并调用join()方法吗?如何确保一个线程在其主线程完成后执行?
回答
最接近的将是一个shutdownHook
,
Runtime.getRuntime().addShutdownHook(new Thread(){
...
});
但这可能会运行过程中仍然活着,一旦进程死亡,多数民众赞成它,则不能将任何线程加入那并不是一个过程再也不存在了。
您可以使用此方法的Runtime.getRuntime()
方法。这里有一个例子:
public static void main(String[] args) {
.....
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
public void run(){
// run when the main thread finishes.
}
}));
}
您可以找到有关此内容的documentation
更多的细节可以人为基本线程对象做如下,虽然我会建议使用在关闭挂钩,而不是其他的答案。
public static void main(String[] args) throws Exception {
// parametrizes with current thread
new Deferrable(Thread.currentThread());
System.out.println("main thread");
}
static class Deferrable extends Thread {
Thread t;
Deferrable(Thread t) {
this.t = t;
// optional
// setDaemon(true);
start();
}
@Override
public void run() {
try {
// awaits termination of given Thread before commencing
t.join();
System.out.println("other thread");
} catch (InterruptedException ie) {
// TODO handle
}
};
}
这将始终打印:
main thread
other thread
你为什么说“人为地”?你为什么认为'Runtime.getRuntime()。addShutdownHook(...)'是一个更好的解决方案?原来的问题是[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem):OP没有告诉我们她想完成什么。她都专注于她所想的是解决她的问题,但我们不知道实际问题是什么。 –
@jameslarge我认为提到'addShutdownHook'的答案在本质上是更好的,因为功能范围很广,而我的答案通过加入一个线程来做到这一点。这就是说,它可能被认为是实现这一目标的另一种方式。 – Mena
@james放大这说,阅读评论回来,这是有点不清楚OP要什么 - 我同意。 – Mena
这种情况的典型的同步是一个CountDownLatch
。已通过调用CountDownLatch.countDown()
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(1); // will need only one countDown to reach 0
new Thread(() -> {
try {
latch.await(); // will wait until CountDownLatch reaches 0
// do whatever is needed
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
// do stuff
// end main thread
latch.countDown(); // will make the latch reach 0, and the spawned thread will stop waiting
}
- 1. 蟒蛇如何保持一个线程执行,直到其他线程完成
- 2. 主线程不会等待另一个线程完成执行
- 3. 如何阻止主线程,直到所有其他线程完成执行?
- 4. 会在子线程完成执行之前退出主线程?
- 5. Android ::在主线程中执行其他任务之前阻止主线程完成主线程
- 6. 如何在完成另一个线程后运行一个线程
- 7. 访谈:如何确保一个线程在另一个线程之后运行?
- 8. JMeter:如何在第一个线程完成后运行两个线程
- 9. Android线程 - 在执行所有其他线程之前执行一个线程
- 10. 如何确保线程在另一个CORE中执行?
- 11. 如何让线程等到另一个线程完成该方法执行
- 12. 阻止主线程完成其执行的最佳方法
- 13. 如何确定完成哪个线程
- 14. C#多线程在任何其他线程完成后添加线程
- 15. 如何使主线程等待其他线程在ThreadPoolExecutor中完成
- 16. 线程是否在完成执行时出现另一个加入的线程?
- 17. 有主线程等待一个线程完成任务(但没有完成)
- 18. 执行在后台和主线程ios
- 19. 如何停止一个线程,直到n个线程完成其工作
- 20. 如何在前一个线程完成后立即启动新线程?
- 21. 如何将任务委托给主线程并等待其执行完成?
- 22. 如何在线程完成后清理线程?
- 23. 线程在执行后保持存活
- 24. 当.NET进程主线程完成时,其他当前正在执行的线程会发生什么?
- 25. 如何创建一个不确定的进度,并在后台启动一个线程,并在Python中完成线程后再次执行一些操作
- 26. 如何让主线程等待所有子线程完成?
- 27. 等待线程完成执行
- 28. 等待线程完成执行上
- 29. 程序完成执行后的线程状态
- 30. 如何在所有线程完成后才执行一段代码
如果你不希望他们同时运行做产生的线程等待
CountDownLatch
之前它所需要,并有主线程完成,为什么还需要2个线程? –我希望它可以同时运行,但只要确保主要完成之前... – Sharon182
您希望主线程在......之前完成?和Scott Hunter所说的一样:你有一个主线程来做某事。我不知道它做了什么,但让我们调用它是'M()'。然后在'M()'完成之后还有其他你想要发生的事情。我们称之为'S()'。为什么你的主线程不能简单地执行'M()'然后执行'S()'?你最近想完成什么? (即什么是'S()'?) –