java:中断线程是绝对必要的吗
我是Java新手,使用的是别人给出的代码。在那里,在代码的末尾,如果线程还没有完成,它们就会中断线程。我正在测量代码的计时 问题是Java代码首先发出所有线程,然后在最后中断。有必要打断吗?我们不能等到所有的线程都完成了吗?或者可能只是跳过中断(这些线程正在使用processexec命令运行进程,它们无论如何都会完成)。 这是相关代码。首先是单个线程的代码:java:中断线程是绝对必要的吗,java,multithreading,interrupt,Java,Multithreading,Interrupt,我是Java新手,使用的是别人给出的代码。在那里,在代码的末尾,如果线程还没有完成,它们就会中断线程。我正在测量代码的计时 问题是Java代码首先发出所有线程,然后在最后中断。有必要打断吗?我们不能等到所有的线程都完成了吗?或者可能只是跳过中断(这些线程正在使用processexec命令运行进程,它们无论如何都会完成)。 这是相关代码。首先是单个线程的代码: String commandString = "./script.scr "; process = Runtime.getRunt
String commandString = "./script.scr ";
process = Runtime.getRuntime().exec(commandString);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((lsString = bufferedReader.readLine()) != null)
{
System.out.println(lsString);
}
try
{
process.waitFor();
}
现在,分派这些线程的部件的代码:
public void stopWhenAllTaskFinished()
{
while(notFinished) {sleep(50);} //notFinished is class variable and somewhere else it will set to false.
//now finished.
//Interrupt all the threads
for (int i=0; i<nThreads; i++) {
threads[i].interrupt();
}
}
我非常感谢您的见解和回答。Oracle在javadocs中提供的以下代码是大多数人都会做的。顺便说一句,这是为了杀死那些在有机会关机后拒绝正常关机的线程
不清楚是否需要从您发布的代码中中断
- 如果在所有线程都已完成时将
设置为notFinished
,则不需要中断false
- 如果当某些线程可能尚未完成时,将
设置为notFinished
,则可能需要执行此操作。是否确实有必要取决于其他因素:false
- 您是否准备好让应用程序等待线程自然完成
- 你能保证线程会完成吗?(他们会永远被悬挂/阻挡吗?)
- 你需要他们活动的结果吗
- 他们会对打断做出反应吗?(在这种情况下,我认为答案是“是”。)
- 把线留在那里有什么害处吗?(例如,它是否会停止应用程序关闭?)
线程
的功能。我添加了相关的代码。老实说,这看起来像是对从未发生过的事情的偏执检查。如果线程被编码成在没有更多工作要做时自行终止,那么整个轮询过程是毫无意义的。只需加入所有线程并完全删除while/sleep代码。如果不知道notFinished
是如何工作的,就无法判断。(例如,可能存在这样一种情况,notFinished
是清晰的,但其中一个线程仍然在进程中被无限期阻塞。WaitFor
?如果是,您需要中断它或修复它。理想情况下,修复它。)线程是否是纯AND操作很重要(在所有线程都完成之前,我们不会完成)或者是一个更复杂的操作(线程a做了一些事情,所以我们不需要线程B来做,即使线程B正在尝试)。但这是针对线程池的-原始问题不使用线程池。是的,代码使用:private PoolWorker[]threads。你能告诉我合适的代码吗(或者提供一个参考)。对不起,我在他发布任何代码之前发布了这个。我将研究这个新问题。@Jon7-你的理解是错误的。它不会杀死不合作的线程。中断的线程可以忽略(甚至没有注意到)中断。。。这就是“不合作”在这里的意思。是的,我准备好了。2.是的,他们一定会完成的。3.不,我只是计算了整个应用程序的时间(在线程上完成的每个任务都需要一些时间,但是如果被中断:这是不好的)。4.是的。我不知道是否有伤害。我唯一的要求是:在完成整个应用程序之前,不应该杀死任何线程。应该只在所有线程都完成时结束。“如果所有线程都完成时notFinished设置为false…”我认为情况并非如此。notFinished在所有线程完成之前被更改。3意味着中断实际上可能是有害的。
obj.stopWhenAllTaskFinished()
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}