Konular aynı saniyede başlamalıdır. Anlıyorum, eğer bunu yaparsanız thread1.start()
, bir sonraki yürütme işleminden önce birkaç milisaniye sürecektir thread2.start()
.
Mümkün mü yoksa imkansız mı?
Konular aynı saniyede başlamalıdır. Anlıyorum, eğer bunu yaparsanız thread1.start()
, bir sonraki yürütme işleminden önce birkaç milisaniye sürecektir thread2.start()
.
Mümkün mü yoksa imkansız mı?
Yanıtlar:
Konuları tam olarak aynı anda başlatmak için (en azından olabildiğince iyi), bir CyclicBarrier kullanabilirsiniz :
// 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");
Bunun a olması gerekmez, CyclicBarrier
bir CountDownLatch
veya hatta bir kilit de kullanabilirsiniz .
Bu hala standart JVM'lerde tam olarak aynı anda başladıklarından emin olamaz , ancak oldukça yaklaşabilirsiniz. Oldukça yakınlaşmak, örneğin performans testleri yaptığınızda hala yararlıdır. Örneğin, bir veri yapısının verimini, kendisine çarpan farklı sayıda iş parçacığı ile ölçmeye çalışıyorsanız, mümkün olan en doğru sonucu elde etmek için bu tür bir yapı kullanmak istersiniz.
Diğer platformlarda, iş parçacığı başlatmak tam olarak çok geçerli bir gereksinim olabilir btw.
CreateEvent
. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
En azından tek çekirdekli bir bilgisayarda mümkün değil. Ama bunu neden istiyorsun? Tam olarak aynı saniyede iki iş parçacığı başlatabilseniz bile, bunlar farklı şekilde ilerleyecektir çünkü programlama sizin kontrolünüzde değildir.
Düzenleme: (Bazı yorumlara yanıt olarak) Birden çok iş parçacığının durumunu veya ilerlemesini senkronize etmek tamamen geçerli bir gerekliliktir ve CyclicBarrier
harika bir araçtır. Aynı anda birden fazla iş parçacığı başlatmanın mümkün olup olmadığı sorusuna cevap verdim . CyclicBarrier
iş parçacıklarının tam olarak istenen durumda olduklarında ilerlemelerini garanti eder , ancak oldukça yakın olsa da tam olarak aynı anda başlayacaklarını veya devam edeceklerini garanti etmez . Soruda senkronizasyon ihtiyaçlarından bahsedilmiyor.
Bunun için bir CountDownLatch kullanabilirsiniz. Lütfen aşağıda bir örnek bulun. T1 ve t2 başlatılsa da, bu iplikler ana iplik mandalı geri sayana kadar beklemeye devam eder. Gerekli geri sayım sayısı kurucuda belirtilmiştir. Geri sayım mandalı, ana iş parçacığının daha fazla ilerleyebilmesi için iş parçacıklarının yürütmeyi bitirmesini beklemek için de kullanılabilir (tersi durum). Bu sınıf Java 1.5'ten beri dahil edilmiştir.
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
}
}