13

有没有办法等待,AtomicInteger这样我就不必一直睡我当前的线程并继续检查AtomicInteger这样的事情

while(atomicInt.get() >= 0) {
    Thread.sleep(1000)
}

我知道有这样的东西,CountDownLatch但它只允许我减少我还需要它能够增加

进一步的背景故事 - 我有一个创建线程的循环,我需要等待其中一个线程执行完成,然后再创建一个新线程。然而,我正在使用一个Executors.newFixedThreadPool(numThreads)等待它的唯一方法似乎是调用关闭方法等待终止,然后创建一个新的线程池,所以我使用原子整数来跟踪正在运行和/或运行的线程数队列,以便当该数字减少时,我可以继续循环。

4

5 回答 5

6

Semaphore看起来它可能更接近你正在寻找的东西,实际上 - 它让你等到一个或多个“许可证”可用。 AtomicInteger不打算用于您如何使用它。

于 2012-05-08T14:47:33.353 回答
2

我认为你真正想要的是处理一些事件。该事件可以反过来增加一个整数。看看BlockingQueue

一个队列,它还支持在检索元素时等待队列变为非空,并在存储元素时等待队列中的空间变为可用的操作。

代码可能看起来像......

MyEvent incrementEvent = queue.take(); //blocks until an event is added to the queue
// increment int and do logic here
于 2012-05-08T14:37:32.937 回答
1

我认为与您想要的更接近的是Phaser。我粗略的理解是,它有点像一个递增计数器,您可以在其中阻塞直到数字递增。

// This constructor one party (so it expects one advance per phase).
Phaser phaser = new Phaser(1);
try {
  // This will timeout as phase 0 hasn't arrived yet.
  phaser.awaitAdvanceInterruptibly(0, 1, TimeUnit.MILLISECONDS);
  fail();
}
catch (TimeoutException expected) {
}

// Arrive phase 0
phaser.arrive();
phaser.awaitAdvance(0);
try {
  // Phase 1 will timeout..
  phaser.awaitAdvanceInterruptibly(1, 1, TimeUnit.MILLISECONDS);
  fail();
}
catch (TimeoutException expected) {
}

// Arrive phase 1
phaser.arrive();
phaser.awaitAdvance(0);
phaser.awaitAdvance(1);
于 2016-12-09T10:49:09.230 回答
0

如果您使用的是 Executors API,那么等待任务完成的正确方法是使用 Future API。示例代码如下所示:

Future<?> future = threadPool.submit(task);
future.get();
于 2012-05-09T00:56:07.397 回答
0

CompletableFuture的简单解决方案

创建两个线程thread1,thread2都可以访问的CompletableFuture

private CompletableFuture<Integer> future = new CompletableFuture<>();

等待线程1(或多个线程)中的值

Integer value = future.join();

计算thread2中的值并完成future

if (!future.isDone()) future.complete(calculatedValue);
于 2019-08-18T12:41:13.830 回答