如何在“完全”同时启动两个线程

线程应该在同一秒开始。 我明白,如果你做了thread1.start() ,在下一次执行thread2.start()之前需要几毫秒的时间。

这是可能的还是不可能的?

要同时启动线程(至less尽可能),可以使用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 ,甚至一个锁。

这仍然不能确保它们在标准JVM上同时启动,但是可以非常接近。 当你做例如性能testing时,变得非常接近仍然是有用的。 例如,如果您尝试使用不同数量的线程来测量数据结构的吞吐量,则希望使用这种结构来获得最准确的结果。

在其他平台上,正确启动线程可能是一个非常有效的要求顺便说一句。

至less在一台核心计算机上是不可能的。 但你为什么要这样? 即使你能够在同一秒内启动两个线程,它们也会有所不同,因为调度不在你的控制之中。

编辑:(对一些评论的回应)这是一个完全有效的要求, 同步多个线程的状态或进度CyclicBarrier是一个伟大的工具。 我回答了是否可以在同一时间启动多个线程的问题。 CyclicBarrier将保证线程正好处于所需状态时继续执行,但不能保证它们将在完全相同的时间启动或恢复,尽pipe它可能非常接近。 在这个问题中没有提到同步需求。

你可以使用CountDownLatch来做到这一点。 请在下面find一个样本。 尽pipet1和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. 如果你可以接受相对的同时性,那么使用其他答案中讨论的技术来模拟它可能更容易。