java:中断线程是绝对必要的吗

java:中断线程是绝对必要的吗,java,multithreading,interrupt,Java,Multithreading,Interrupt,我是Java新手,使用的是别人给出的代码。在那里,在代码的末尾,如果线程还没有完成,它们就会中断线程。我正在测量代码的计时 问题是Java代码首先发出所有线程,然后在最后中断。有必要打断吗?我们不能等到所有的线程都完成了吗?或者可能只是跳过中断(这些线程正在使用processexec命令运行进程,它们无论如何都会完成)。 这是相关代码。首先是单个线程的代码: String commandString = "./script.scr "; process = Runtime.getRunt

我是Java新手,使用的是别人给出的代码。在那里,在代码的末尾,如果线程还没有完成,它们就会中断线程。我正在测量代码的计时

问题是Java代码首先发出所有线程,然后在最后中断。有必要打断吗?我们不能等到所有的线程都完成了吗?或者可能只是跳过中断(这些线程正在使用processexec命令运行进程,它们无论如何都会完成)。 这是相关代码。首先是单个线程的代码:

  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();
   }
 }