我想在線程死亡之前在最後執行代碼。所以我在尋找的是線程的某種dispose(),tearDown()方法,以確保某些任務在退出線程之前執行。如何在退出線程時執行代碼
1
A
回答
2
你可以用代碼來在自己的代碼一個單獨的線程具有try
/finally
塊內執行,並從try
稱之爲的「真正的」 Runnable
的run
方法,像這樣:
final Runnable realRunnable = ... // This is the actual logic of your thread
(new Thread(new Runnable() {
public void run() {
try {
realRunnable.run();
} finally {
runCleanupCode();
}
}
})).start();
runCleanupCode()
的代碼將在用於運行實際線程邏輯的相同線程中執行。
+0
是的,又名'如果您想要函數中的某些代碼最後執行,請將其放在末尾':) –
1
以dasblinkenlight的回答遠一點(太遠):
class ThreadWithCleanup extends Thread {
final Runnable main;
final Runnable cleanup;
ThreadWithCleanup(Runnable main, Runnable cleanup) {
this.main = main;
this.cleanup = cleanup;
}
@Override
public void run() {
try {
main.run();
} finally {
cleanup.run();
}
}
}
public class Demo {
public static void main(String[] args) {
Runnable m = new Runnable() {
@Override
public void run() {
System.out.println("Hello from main.");
throw new RuntimeException("Bleah!");
}
};
Runnable c = new Runnable() {
@Override
public void run() {
System.out.println("Hello from cleanup.");
}
};
ThreadWithCleanup threadWithCleanup = new ThreadWithCleanup(m, c);
threadWithCleanup.start();
try {
threadWithCleanup.join();
} catch (InterruptedException ex) {
}
}
}
我曾經以爲我再也看不到一個正當的理由來擴展Thread類!
2
其他答案沒有考慮到你正在討論線程池。這是你需要做的:
private static class MyThreadFactory implements ThreadFactory {
public Thread newThread(final Runnable r) {
return new Thread() {
public void run() {
try {
r.run();
} finally {
// teardown code
}
}
};
}
}
public static void main(String[] args) {
ThreadPoolExecutor exec = new ThreadPoolExecutor(10, 20, 100, TimeUnit.SECONDS, null, new MyThreadFactory());
}
相關問題
- 1. 如何退出執行jquery代碼?
- 2. 如何在執行循環過程時退出forkIO線程
- 3. Python線程退出代碼
- 4. 在應用程序退出時執行代碼
- 5. 在Windows C++中退出代碼線程
- 6. 如何在應用程序退出時使用PostSharp執行一段代碼?
- 7. 用代碼01退出的C++程序沒有執行代碼
- 8. 如何在退出Vorpal.js應用程序時運行代碼?
- 9. 正常進程退出時的.NET代碼執行?
- 10. 當退出Windows 8.1時執行代碼應用程序
- 11. 當主線程退出時,如何讓子線程退出?
- 12. 如何在退出時殺死線程?
- 13. MSBuild執行任務,退出代碼空
- 14. 如何在調用「退出」後執行剩餘的PHP代碼?
- 15. Cudafy線程已退出,代碼爲259
- 16. 會在子線程完成執行之前退出主線程?
- 17. 在強制退出時執行代碼塊?
- 18. 當VisualStudio調試器正在退出時執行代碼
- 19. 執行代碼時出錯
- 20. 執行Javascript代碼在後臺線程
- 21. 如何在生成,分離的子進程從NodeJS退出後執行代碼
- 22. 如何在使用open/print執行SQL語句時捕獲退出代碼?
- 23. GetExitCodeProcess在進程不存在時如何獲取退出代碼
- 24. 如何退出codeigniter程序的執行?
- 25. 如何在線程退出時觸發代碼,而不使用函數* _at_thread_exit?
- 26. 如何獲得使用Testcontainers執行的命令退出代碼?
- 27. scala在線代碼執行
- 28. 代碼(java,多線程)在一行代碼後停止執行
- 29. 如何在退出Java程序時執行一組命令?
- 30. 如何在程序退出之前運行代碼?
id很難說如何改變你的線程,而沒有關於它的信息。例如它是守護線程?它的任務如何?任務是否在無限循環中執行?你現在如何處理線程中斷? – Pshemo
它是threadPoolExecutor中的一個任務,實現爲Runnable – tip