4

有没有办法在整体超时的情况下同时加入一组线程?

假设我们有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);
}
4

1 回答 1

3

首先为组中的每个线程创建一个具有计数的单个 CountDownLatch。

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

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

启动组中的线程。

组中的每个线程都应在完成时减少锁存器。

控制线程将一直等待,直到组中的所有内容都完成或发生超时,并且由于await返回一个布尔值,控制线程可以判断锁存器是否自然递减或是否发生超时。

于 2019-11-21T15:06:59.443 回答