Как запустить два потока в "точно" то же время


потоки должны начинаться с той же доли секунды. Я понимаю, если вы делаете thread1.start(), Это займет несколько миллисекунд до следующего исполнения thread2.start().

это вообще возможно или невозможно?

4 64

4 ответа:

чтобы запустить потоки точно в то же время (по крайней мере, как можно лучше), вы можете использовать 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 или даже замок.

Это все еще не может убедиться, что они запущены ровно в то же время на стандартных JVMs, но вы можете получить довольно близко. Получение довольно близко по-прежнему полезно, когда вы делаете, например, тесты производительности. Например, если вы пытаясь измерить пропускную способность структуры данных с различным количеством потоков, попадающих в нее, вы хотите использовать этот вид конструкции, чтобы получить максимально точный результат.

на других платформах, запуск потоков ровно может быть очень действительным требованием кстати.

это невозможно, по крайней мере, на одном основном компьютере. Но зачем тебе это? Даже если вы смогли запустить два потока в одну и ту же секунду, они будут развиваться по-разному, потому что планирование не находится под вашим контролем.

Edit: (в ответ на некоторые комментарии) это совершенно правильное требование к синхронизировать состояние или прогресс нескольких потоков и CyclicBarrier - Это отличный инструмент. Я ответил на вопрос, Можно ли начать несколько потоков в то же самое время. CyclicBarrier гарантирует, что потоки продолжатся, когда они точно находятся в нужном состоянии, но это не гарантирует, что они будут запускаться или возобновляться в ровно то же время, хотя это может быть довольно близко. В вопросе нет упоминания о необходимости синхронизации.

вы можете использовать обратный отсчет для этого. Пожалуйста найдите под образцом. Хотя 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
    }
}
  1. Как я понимаю, JVM в основном делегирует этот материал в операционную систему. Поэтому ответ будет специфичным для ОС.
  2. это явно невозможно на однопроцессорных машинах.
  3. это сложнее по отношению к многопроцессорной машине. Согласно относительность одновременности, " невозможно сказать в абсолютном смысле, происходят ли два события одновременно, если эти события разделены в пространстве.- Неважно как. закройте ваши процессоры, они разделены в пространстве.
    1. Если вы можете принять относительную одновременность, то, вероятно, проще просто имитировать ее, используя методы, обсуждаемые в других ответах.