我想從主線程運行一個線程,但我希望此線程在主線程完成後執行。 我該怎麼做? 我可以通過線程引用主線程並調用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. 使用ThreadPool完成其他線程後執行一些線程
- 3. 主線程不會等待另一個線程完成執行
- 4. 線程 - 確保線程完成在C#
- 5. 我如何確保在所有線程完成執行後執行語句
- 6. 如何阻止主線程,直到所有其他線程完成執行?
- 7. 會在子線程完成執行之前退出主線程?
- 8. Android ::在主線程中執行其他任務之前阻止主線程完成主線程
- 9. 如何在執行某些操作之前確保其他線程已完成
- 10. 如何在完成另一個線程後運行一個線程
- 11. 訪談:如何確保一個線程在另一個線程之後運行?
- 12. 單線程執行完成
- 13. JMeter:如何在第一個線程完成後運行兩個線程
- 14. 如何在其他完成後停止一個線程?
- 15. Android線程 - 在執行所有其他線程之前執行一個線程
- 16. 如何在特定線程完成其工作後執行一些代碼?
- 17. 後臺工作線程中的函數調用只有在主線程執行完成後才能執行?
- 18. 如何讓線程等到另一個線程完成該方法執行
- 19. 如何確保線程在另一個CORE中執行?
- 20. 阻止主線程完成其執行的最佳方法
- 21. 如何確定完成哪個線程
- 22. C#多線程在任何其他線程完成後添加線程
- 23. 線程完成時通知主線程
- 24. 如何確保Python線程在其目標函數完成後死亡?
- 25. 如何掛起一個線程另一個線程完成其工作之前
- 26. 斯卡拉 - 多線程,當任何子線程完成時完成主線程
- 27. 如何在完成另一個線程中的代碼塊後執行任務
- 28. 如何使主線程等待其他線程在ThreadPoolExecutor中完成
- 29. 在c中,如何使一個線程等待其他線程完成
- 30. 如何確保線程在另一個線程之前啓動?
如果你不希望他們同時運行做產生的線程等待
CountDownLatch
之前它所需要,並有主線程完成,爲什麼還需要2個線程? –我希望它可以同時運行,但只要確保主要完成之前... – Sharon182
您希望主線程在......之前完成?和Scott Hunter所說的一樣:你有一個主線程來做某事。我不知道它做了什麼,但讓我們調用它是'M()'。然後在'M()'完成之後還有其他你想要發生的事情。我們稱之爲'S()'。爲什麼你的主線程不能簡單地執行'M()'然後執行'S()'?你最近想完成什麼? (即什麼是'S()'?) –