スレッドは同じスプリット秒で開始する必要があります。あなたがそうした場合thread1.start()
、次のの実行までに数ミリ秒かかると思いますthread2.start()
。
それは可能か不可能か?
スレッドは同じスプリット秒で開始する必要があります。あなたがそうした場合thread1.start()
、次のの実行までに数ミリ秒かかると思いますthread2.start()
。
それは可能か不可能か?
回答:
スレッドをまったく同時に(少なくとも可能な限り)開始するには、CyclicBarrierを使用できます。
// We want to start just 2 threads at the same time, but let's control that
// timing from the main thread. That's why we have 3 "parties" instead of 2.
final CyclicBarrier gate = new CyclicBarrier(3);
Thread t1 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
Thread t2 = new Thread(){
public void run(){
gate.await();
//do stuff
}};
t1.start();
t2.start();
// At this point, t1 and t2 are blocking on the gate.
// Since we gave "3" as the argument, gate is not opened yet.
// Now if we block on the gate from the main thread, it will open
// and all threads will start to do stuff!
gate.await();
System.out.println("all threads started");
これはである必要はありません。ロックをCyclicBarrier
使用することもできCountDownLatch
ます。
これでも、標準のJVMでそれらが正確に同時に開始されていることを確認することはできませんが、かなり近づくことができます。たとえばパフォーマンステストなどを行う場合は、かなり近づくことも役に立ちます。たとえば、データ構造にヒットするスレッドの数が異なるデータ構造のスループットを測定しようとしている場合、この種の構成を使用して、可能な限り最も正確な結果を取得する必要があります。
他のプラットフォームでは、開始スレッドは正確ところで非常に有効な要求をすることができます。
CreateEvent
たときに返される手動リセットイベントです。msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
少なくともシングルコアコンピュータでは不可能です。しかし、なぜそれが必要なのですか?2つのスレッドをまったく同じ秒に開始できたとしても、スケジューリングが制御できないため、スレッドの進行は異なります。
編集:(コメントの一部に対応)複数のスレッドの状態または進行状況を同期することは完全に有効な要件でCyclicBarrier
あり、優れたツールです。複数のスレッドを同時に開始することが可能かどうかという質問に答えました。CyclicBarrier
それらが所望の状態で正確ですが、それは彼らがで開始または再開されることを保証するものではないときのスレッドが進行することが保証されます正確に、それは非常に近いかもしれませんが、同じ時間。質問には同期の必要性についての言及はありません。
これにはCountDownLatchを使用できます。以下のサンプルを見つけてください。t1とt2が開始されても、これらのスレッドはメインスレッドがラッチをカウントダウンするまで待機し続けます。必要なカウントダウンの数はコンストラクターに記載されています。カウントダウンラッチを使用して、スレッドが実行を完了するのを待機し、メインスレッドをさらに進めることもできます(逆の場合)。このクラスはJava 1.5以降に含まれていました。
import java.util.concurrent.CountDownLatch;
public class ThreadExample
{
public static void main(String[] args)
{
CountDownLatch latch = new CountDownLatch(1);
MyThread t1 = new MyThread(latch);
MyThread t2 = new MyThread(latch);
new Thread(t1).start();
new Thread(t2).start();
//Do whatever you want
latch.countDown(); //This will inform all the threads to start
//Continue to do whatever
}
}
class MyThread implements Runnable
{
CountDownLatch latch;
public MyThread(CountDownLatch latch)
{
this.latch = latch;
}
@Override
public void run()
{
try
{
latch.await(); //The thread keeps waiting till it is informed
} catch (InterruptedException e) {
e.printStackTrace();
}
//Do the actual thing
}
}