Utas harus dimulai pada sepersekian detik yang sama. Saya mengerti, jika Anda melakukannya thread1.start()
, diperlukan beberapa milidetik sebelum eksekusi berikutnya thread2.start()
.
Apakah itu mungkin atau tidak mungkin?
Utas harus dimulai pada sepersekian detik yang sama. Saya mengerti, jika Anda melakukannya thread1.start()
, diperlukan beberapa milidetik sebelum eksekusi berikutnya thread2.start()
.
Apakah itu mungkin atau tidak mungkin?
Jawaban:
Untuk memulai utas pada waktu yang persis sama (setidaknya sebaik mungkin), Anda dapat menggunakan 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");
Ini tidak harus berupa CyclicBarrier
, Anda juga dapat menggunakan CountDownLatch
atau bahkan kunci.
Ini masih tidak dapat memastikan bahwa mereka dimulai tepat pada waktu yang sama pada JVM standar, tetapi Anda bisa cukup mendekati. Mendekatkan diri masih berguna saat Anda melakukan, misalnya, uji kinerja. Misalnya, jika Anda mencoba mengukur throughput dari struktur data dengan jumlah thread berbeda yang memukulnya, Anda ingin menggunakan jenis konstruksi ini untuk mendapatkan hasil yang paling akurat.
Di platform lain, memulai utas dengan tepat bisa menjadi persyaratan yang sangat valid.
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
Ini tidak mungkin, setidaknya pada satu komputer inti. Tapi kenapa kamu menginginkan itu? Meskipun Anda dapat memulai dua utas pada detik yang persis sama, kemajuannya akan berbeda karena penjadwalan tidak ada dalam kendali Anda.
Sunting: (Menanggapi beberapa komentar) Ini adalah persyaratan yang sangat valid untuk menyinkronkan keadaan atau kemajuan beberapa utas dan CyclicBarrier
merupakan alat yang hebat. Saya menjawab pertanyaan apakah mungkin untuk memulai beberapa utas pada waktu yang persis sama . CyclicBarrier
akan menjamin bahwa utas melanjutkan ketika mereka berada tepat pada keadaan yang diinginkan tetapi itu tidak menjamin bahwa utas akan memulai atau melanjutkan pada waktu yang persis sama, meskipun mungkin cukup dekat. Tidak disebutkan kebutuhan sinkronisasi dalam pertanyaan.
Anda bisa menggunakan CountDownLatch untuk ini. Temukan di bawah contoh. Meskipun t1 dan t2 dimulai, utas ini terus menunggu hingga utas utama menghitung mundur kait. Jumlah hitungan mundur yang dibutuhkan disebutkan dalam konstruktor. Kait penghitung mundur juga dapat digunakan untuk menunggu utas menyelesaikan eksekusi sehingga utas utama dapat melanjutkan lebih jauh (kasus sebaliknya). Kelas ini termasuk sejak 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
}
}