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 で提供する次のコードは、ほとんどの人が行うものです。私の知る限り、これは、シャットダウンする機会を与えた後、正常にシャットダウンすることを拒否するスレッドを強制終了するように設計されています。

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 に答える