我想在线程死亡之前在最后执行代码。所以我在寻找的是线程的某种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