6

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

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

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

这个函数是从主类调用的,例如:

 obj.stopWhenAllTaskFinished()

我非常感谢任何见解或答案。

4

2 回答 2

2

Oracle 在 javadocs 中提供的以下代码是大多数人所做的。AFAIK,这旨在杀死拒绝在给它们关闭的机会后正常关闭的线程。

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

 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();
   }
 }
于 2012-05-02T01:43:12.993 回答
1

目前尚不清楚您发布的代码是否需要中断。

  • 如果notFinished设置为false当所有线程都完成时,则不需要中断。

  • 如果notFinished设置为false某些线程可能尚未完成时,则可能有必要。是否真的有必要取决于其他事情:

    • 您是否准备好让应用程序等待线程自然完成?
    • 你能确定线程完成吗?(他们可以永远挂起/阻塞吗?)
    • 你需要他们活动的结果吗?
    • 他们会响应中断吗?(在这种情况下,我认为答案是“是”。)
    • 把线留在那里有什么害处吗?(例如,它会阻止应用程序关闭吗?)
于 2012-05-02T02:05:58.997 回答