Потоки должны начинаться в одну и ту же долю секунды. Я понимаю, что если вы это сделаете 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замок или даже замок.
Это до сих пор не может убедиться , что они начали именно в то же время на стандартных виртуальных машинах, но вы можете получить довольно близко. Подобраться довольно близко по-прежнему полезно, когда вы, например, проводите тесты производительности. Например, если вы пытаетесь измерить пропускную способность структуры данных при разном количестве обращающихся к ней потоков, вы хотите использовать такую конструкцию, чтобы получить наиболее точный результат.
На других платформах, начиная потоки точно могут быть очень действительное требование кстати.
CreateEvent. msdn.microsoft.com/en-us/library/ms686364%28VS.85%29.aspx
Это невозможно, по крайней мере, на одноядерном компьютере. Но зачем тебе это нужно? Даже если вы смогли запустить два потока точно в одну и ту же секунду, они будут выполняться по-разному, потому что планирование не находится в вашей власти.
Изменить: (в ответ на некоторые комментарии) Это совершенно правильное требование для синхронизации состояния или хода выполнения нескольких потоков, и 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
}
}