2016-08-26 16 views
0

スレッドを複数回起動しようとしています。しかし、私はそれが可能ではないことを読んでいます。なぜなら、そのためのIllegalThreadStateExceptionを取得するからです。 Iamは次のことをしようとしています。私はnスマートフォンがあります。私はアプリの自動テストをしたいと思います。テストは並列で、デバイスごとに1つのアプリケーションになります。それを解決するための任意のアイデア?私のコードはここにありますか?1つのスレッドで2つ以上の開始

Semaphore smartphones = new Semaphore(androidComponents.size()); 
Thread evaluationProcess = new Thread() { 
     public void run() { 
      try { 
       smartphones.acquire(); 
       [CODE FOR TESTING] 
       smartphones.release(); 
     } 
    }; 

    while (!evaluationCompleted(apps)) { 
     evaluationProcess.start(); 
     while (smartphones.availablePermits() == 0) ; 
    } 
+0

既に実行中のスレッドを開始しようとしています。それは定義によっては機能しません。 Threadクラスやオブジェクトをスレッドコンセプトと混同しているかもしれませんか? – Sentry

+0

さて、このRunnableインスタンスから1つのRunnableインスタンスと複数のThreadインスタンスを作成します。また、何か起こるのを待つためにビジーループを使用しないでください。 –

+0

エグゼキュータのプールは、ベアスレッドを使用するよりも優先されるべきです。新しい並行性パッケージには理由があります。 – duffymo

答えて

2

自分のスレッドやスレッドを忘れてしまいます。代わりにThreadPoolを使用してください。

スレッドプールでは、「ランナー」と呼ばれるメソッドを実行できます。すべてのスマートフォンをスレッドセーフ(「並行」)ノンブロッキングキューに入れます。各「ランナー」は、キューから次のスマートフォンをポップし、テストを実行して戻ります。待ち行列が空でない限り、ランナーを開始してください。または、一度にスマートフォンのように多くのランナーを走らせて、同時にどれくらいの数のスレッドを同時に実行するのかについてThreadPoolが心配するようにしてください。

ThreadPoolsで読むと、ジョブに使用するツールです。

+1

スレッドプールはスレッドの簿記を処理し、プールをシャットダウンするときにスレッドの結合を処理します。さらに、固定サイズのスレッドプールは、OPのセマフォを不要にします。その目的は、単に同時に実行されるスレッドの数を制限するように見えるからです。私は自分自身のスレッド管理を行うことと必ずしも反対ではありませんが、この場合はプールを使用するのに非常に適しているようです。 –

+1

ThreadPoolsが私を助けてくれて、ありがとう。 – DynamicBit

3

スレッドで2回startを呼び出すことができないためです。

Thread API:

複数回のスレッドを開始する法的なことはありません。特に、 スレッドは、実行が完了すると再開されないことがあります。複数のスレッドで実行する必要があるコード -

あなたは)(仕事のユニットを実行を入れなければなりません。そして、必要な数のスレッドをインスタンス化します(それぞれをstartで呼び出しますが、一度だけ呼び出します)。

1

独自のクラスにスレッド実装を抽出し、それらのインスタンスをインスタンス化し、それらを1つずつ開始します。例:

public class MyThread extends Thread { 
    @Override 
    public void run() { 
     // Do some cool stuff here! 
    } 
} 

...そして、他の場所であなたのコードでは、あなたのスレッドの複数の「コピー」を開始したい...

public void startThreads() { 
    MyThread threadA = new MyThread(), 
      threadB = new MyThread(), 
      threadC = new MyThread(); 
    threadA.start(); 
    threadB.start(); 
    threadC.start(); 
    // make as many as you need, then invoke start on them. 
} 

しかし、他の人がすでに指摘したように、スレッドの各インスタンスはstart()を1回だけ実行できます。

関連する問題