Потоки должны начинаться в одну и ту же долю секунды. Я понимаю, что если вы это сделаете thread1.start()
, то до следующего выполнения thread2.start()
.
Это вообще возможно или невозможно?
java
multithreading
Фигаро
источник
источник
Ответы:
Чтобы запускать потоки в одно и то же время (по крайней мере, насколько это возможно), вы можете использовать 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 } }
источник
источник