有两个或更多线程:主要和几个孩子。儿童是工人,主要控制儿童的生活。一旦主线程检测到子线程已死,它就会创建新线程。
目前我无法想象比在循环中的每个线程上检查t.isAlive()
更好的解决方案,但众所周知,开发人员应该不惜任何代价避免轮询。
请注意。工作线程可以在HTTP响应上等待几分钟(getInputStream()
上的URLConnection
)
更新
工作人员没有完成其工作,但在收到响应或超时后,它会创建新连接并等待服务器响应。
答案 0 :(得分:1)
如果你真的不需要,你不应该使用低级线程方法。相反,请使用Java Concurrency API。对于你的情况,我会使用一个控制线程的线程池。如果一个线程完成了它的工作,它就会返回池而不是真的死了。
答案 1 :(得分:0)
根据您提问中的目的和评论中的“对话”,我建议您遵循简单的想法。
如果你想重新创建具有相同功能的线程,你为什么要让线程死?
如果你正如你所说的那样,你可以将它们包装到另一个线程中,并且不允许它们死掉。
考虑一下,3-d方Thread
实现称为ThirdPartyThread
类。因此,不要使用.isAlive()
检查其状态,而是将其包装到try ... catch
的另一个线程中:
new Thread(new Runnable() {
@Override
public void run() {
do {
try {
new ThirdPartyThread().run();
} catch (Throwable t) {
// you can vary behaviour here with different classes of exceptions.
// But main idea is to catch their death and go on
}
} while (true); // instead of `true` you can use your specific condition
}
}).start();
答案 2 :(得分:0)
Andremoniy:如果要重新创建具有相同功能的线程,为什么要让线程死掉?
gumkins:例如,我无法在第三方代码中修复未捕获的异常。
如果捕获异常没有意义,并继续在同一个线程中运行,那么启动新线程以获取旧线程的位置是没有任何意义的。启动新线程可以完成 nothing 。
所有线程共享相同的堆和相同的全局状态。如果库在静态变量或单例对象中保持全局状态,那么在每个线程中都可以看到相同的状态。如果在一些异常之后全局状态被破坏/无效,那么它将在每个线程中无效/被破坏。 (这包括程序在损坏完成后创建的任何 new 线程。)
顺便提一下,你试图在这里重新发明的轮子有一个名字:它被称为"线程池。"
Java标准库提供了许多不同类型的线程池,它们都实现了java.util.concurrent.ExecutorService
接口。你应该看看它。