有没有一种方法,以等待在原子整数变化(Is there a way to wait for the

2019-09-17 02:32发布

有没有办法等待上AtomicInteger ,这样我就不必继续睡我的当前线程和继续检查对AtomicInteger这样

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

我知道有这样的事,作为一个CountDownLatch但只允许我减我还需要它能够增加

进一步的背景故事 - 我有一个循环创建线程,我需要等待的线程执行创建一个新线程之前完成的一个。 然而,我现在用的Executors.newFixedThreadPool(numThreads)并等待它的唯一方法似乎是调用shutdown方法等待终止,然后创建一个新的线程池这样反而我使用原子整数跟踪有多少线程正在运行和/或队列,这样,当这个数字减少我可以循环下去。

Answer 1:

Semaphore看起来似乎更接近你要找的东西,实际上-它可以让你等到一个或多个“许可证”是可用的。 AtomicInteger并不意味着你如何使用它来使用。



Answer 2:

我想你真正想要的是处理一些事件。 这一事件可能反过来增加一个整数。 采取在偷看BlockingQueue的 。

支持两个附加等待获取元素时队列变为非空,并等待空间在队列中存储元素时变得可用的操作的队列。

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

MyEvent incrementEvent = queue.take(); //blocks until an event is added to the queue
// increment int and do logic here


Answer 3:

我觉得更匹配到你想要的是一个移相器 。 我粗略的理解是,它有点像一个递增的柜台里,你可以阻止,直到数量递增。

// 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);


Answer 4:

如果您使用的执行人API,以正确的方式来等待任务完成使用未来API。 示例代码如下显示:

Future<?> future = threadPool.submit(task);
future.get();


Answer 5:

CompletableFuture简单的解决方案

通过创建两个线程线程1,线程2访问CompletableFuture

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

等待在线程1(多个线程或)值

Integer value = future.join();

在线程2,完整的未来计算值

if (!future.isDone()) future.complete(calculatedValue);


文章来源: Is there a way to wait for the change on an atomic integer