加入一组总超时的线程

Join a group of threads with overall timeout

有没有办法同时加入一组线程 总超时

假设我们有 Collection<Thread> threads;int timeout;。如果我不关心超时,我会做

for (Thread t : threads)
    t.join();

但我想等到 所有 个线程完成,或经过一定时间,以先到者为准。我正在寻找可以做到这一点的(假设的)ThreadGroup.join(int)


请注意,我要求的与实际做的不同

for (Thread t : threads)
    t.join(timeout);

相反,我正在寻找比

更简洁(也许更可靠)的东西
int timeout = 10000;
for (Thread t : threads) {
    if (timeout <= 0) break;

    long start = System.currentTimeMillis();
    t.join(timeout);
    long end = System.currentTimeMillis();

    // substract time elapsed from next timeout:
    timeout -= (int) (end - start);
}

首先创建一个 CountDownLatch,对组中的每个线程进行计数。

控制线程可以 await(timeout, TimeUnit) 闩锁。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html#await-long-java.util.concurrent.TimeUnit-

启动组中的线程。

组中的每个线程都应在闩锁完成时递减它。

控制线程会等到组中的所有内容都完成或超时发生,并且因为 await returns 一个布尔值,控制线程可以判断锁存器是自然递减还是发生超时。