2016-06-23 9 views
1

Executorサービスのスレッドを停止する必要がある状況が発生しました。Executorサービスでスレッドを停止する

私はすでにFutureオブジェクトを利用してタスクをキャンセルすると言われる他の投稿で解決策を読みました。

しかし、私はむしろ別のアプローチを試みました。

この方法に問題がある場合は、誰でも教えてください。

以下は私のRunnableクラスです。

import java.io.IOException;  
import java.util.concurrent.Executor; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class ruunTest {  
    public static void main(String[] args) throws IOException,  InterruptedException {  
     // TODO Auto-generated method stub  

     ExecutorService service = Executors.newCachedThreadPool(); 

     TestRunnable test = new TestRunnable(); 

     service.execute(test);  

     Thread.sleep(1000);    
     System.out.println("About to Interrupt");  

     test.getT().interrupt(); 
    }   
} 
+5

のErrは、はい、深刻な問題があります:それはスレッドを停止しません。 JVM全体を停止します。あなたは何を達成しようとしていますか? –

+0

@jbnizet JVMを停止する方法は? – emotionlessbananas

+0

申し訳ありませんが、コードからSystem.exit(0)を削除してそこにbreak文を置いても何が残っていますか? – ramasCoder

答えて

0

これを行うための唯一の適切な方法は、あなたのタスクにし、あなたのタスクに対応するFuturecancelすることで、あなたは定期的にチェックする必要があります。

そのような何か:

public class Task implements Callable<Void> { 
    @Override 
    public Void call() throws InterruptedException { 
     while(true) { 
      // Check regularly in your code if the thread has been 
      // interrupted and if so throws an exception to stop 
      // the task immediately 
      if (Thread.currentThread().isInterrupted()) { 
       throw new InterruptedException("Thread interrupted"); 
      } 
     } 
    } 
} 

次に、あなたのメインのコードは次のようになります。

ExecutorService service = Executors.newCachedThreadPool(); 
// My task 
Task task = new Task(); 
// Submit the task and get the corresponding future 
Future<?> future = service.submit(task); 
... 
// Cancel the task which will interrupt the thread that was executing the 
// task if any 
future.cancel(true); 
-2

それが処理する必要threadDeathErrorをスローしますが、あなたは、thread.stopを使用することができます後

public class TestRunnable implements Runnable {  
    Thread t; 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     setT(Thread.currentThread()); 

     while(true) 
     { 
      if(Thread.currentThread().isInterrupted()) 
      { 
       System.out.println("From Inside thread, Exiting"); 
       System.exit(0); 
      } 
     } 
    } 

    public void setT(Thread t) { 
     this.t = t; 
    } 

    public Thread getT() { 
     return t; 
    } 
} 

は私の主な方法です。

future.cancelを使用すると、タスクはキャンセルされますが、スレッドがスレッドプールに戻るため、スレッドは強制終了されません。 Thread.stopはスレッドを強制終了します。

+0

だから、どんな男、それは削除されていないdeprectaedです。 –

+0

は、なぜ非難されたのかを理解せずに悪用することを意味するものではありません。 – Nazgul

+0

それはあなたがコメントで攻撃的な言語を使用することを意味しません –

-1

スレッドを自発的に停止させることはお勧めできません。あなたのコードはスレッドを止めておらず、実際にJVMフォーム全体をさらにブロックしています。あなたは実際に、エグゼクティブ・サービスの全ポイントを欠いています。

エグゼクティブのイデオロギーは、「私はあなたのために仕事をするスレッドの拡大/縮小リストを持っています。 'あなた'は、私に個人的で相互に排他的な仕事の仕事(ランナブルまたはコール可能なもの)を与えるだけです。ここで理解すべき重要なポイントは、「スレッドとそのライフサイクルについて心配しないでください」...作業項目を作成し、実行するためにそれらを与えるだけです。作業を実行したくない場合や、途中で途中で停止したい場合は、cancelメソッドを使用してください。それ以外は心配する必要はありません。終了したら 'I'が終了してクリーンナップして戻り値を返します。

Iはまた、あなたのためのスレッドプールを管理しますが、作業の仕事がより速い来るときより多くのスレッドでそれを拡大し、雇用はそれほど頻繁に注ぐされている「アイドルスレッドを閉じる」ことで、より少ないスレッドに、それを収縮します。

今、あなたが達成しようとしていることは正しいのでしょうか教えてください。

+0

私は同意します。しかし、あなたはまだ上記のアプローチの欠点を示唆することができます。 – ramasCoder

+1

あなたのアプローチまたは私のアプローチは?あなたのアプローチは設計上間違っています。並行性はそのように実装すべきではありません。正しいアプローチでは、仕事のやりとりは仕事の複雑さを意識する必要はありません。これはまた、あなたが仕事や仕事の種類に献身的な人を捧げるべきではないことを意味します。どのような仕事で、どのようにそれを行うのかは、仕事の中にカプセル化されていて、実行者と一緒にカプセル化されるべきではありません。自分のやり方では、効率的な並行性を実現できます。 – Nazgul

+0

なぜdownvoteの仲間?説明する気に? – Nazgul

-1

thread.interrupt()を試してくださいが、はお勧めしません。です。

+0

クレームを参照することで戻すことはできますか? – Fildor

+1

割り込みはスレッドを停止しません.....スレッドが実行可能状態に戻って再び実行されるまでしばらく停止します。 – Nazgul

+0

申し訳ありませんが、十分であると思いました。 – Irazza

-1

スレッド用のQuasarライブラリを使用して、Javaのネイティブスレッドをより高速に実行でき、使いやすくなります。スレッドが中断されたかどう http://www.paralleluniverse.co/quasar/

+1

「ファイバー」と「ストランド」でさえ、自発的に停止することはできません。あなたは、問題の所有者が自分の意思決定の問題を訂正するのを助けていません代わりに、彼は実際に彼がやりたいことをしない新しい図書館に彼を転用しています。 – Nazgul

+0

これはスレッドを自発的に停止させることではなく、スレッドを停止するだけであり、このライブラリはより速く簡単になります。私はそれを使用していない、私はちょうどいくつかのドキュメントとテストを読み、それは非常によく見えます。 – Victorqedu

+0

スレッドを手動で停止することは、自発的にそれを停止することと同じであり、特にJVMの作成者とJDKの作者自身がそうではないと言ったときにはうまくいきません。 – Nazgul

関連する問題