Java 有没有办法等待原子整数的更改

Java 有没有办法等待原子整数的更改,java,multithreading,atomic,Java,Multithreading,Atomic,有没有一种方法可以等待AtomicInteger,这样我就不必继续休眠当前线程并继续像这样检查AtomicInteger while(atomicInt.get() >= 0) { Thread.sleep(1000) } 我知道有一个倒数锁存器,但它只允许我递减,我也需要它才能递增 进一步的背景故事- 我有一个创建线程的循环,在创建新线程之前,我需要等待其中一个线程的执行完成。但是,我使用的是一个Executors.newFixedThreadPool(numThreads)等

有没有一种方法可以等待
AtomicInteger
,这样我就不必继续休眠当前线程并继续像这样检查
AtomicInteger

while(atomicInt.get() >= 0) {
    Thread.sleep(1000)
}
我知道有一个倒数锁存器,但它只允许我递减,我也需要它才能递增

进一步的背景故事-
我有一个创建线程的循环,在创建新线程之前,我需要等待其中一个线程的执行完成。但是,我使用的是一个
Executors.newFixedThreadPool(numThreads)
等待它的唯一方法似乎是调用shutdown方法wait termination,然后创建一个新的线程池,因此我使用了一个原子整数来跟踪有多少线程正在运行和/或在队列中,这样当这个数字减少时,我可以继续循环。

我想你真正想要的是处理一些事件。该事件可以依次递增一个整数。看一眼这张照片

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

代码可能看起来像

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

看起来它可能更接近你想要的,实际上——它允许你等待一个或多个“许可证”可用
AtomicInteger
不适用于您如何使用它。

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

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

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

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

具有可完成未来的简单解决方案

创建两个线程均可访问的CompletableFuture线程1、线程2

private CompletableFuture<Integer> future = new CompletableFuture<>();
计算thread2中的值并完成未来

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

简短的回答是否定的。你能编辑你的问题并解释一下你为什么想要这个吗?可能还有其他选择。为什么不使用WaitForSingleObject等待呢。创建一个while循环来等待是一个糟糕的想法。等待一个原子对象完全违背了无等待算法的目的。你做错了。实际上,这里看起来更合适。你能解释一下你的情况吗(为什么)。我认为没有必要的信息就没有有用的建议。
if (!future.isDone()) future.complete(calculatedValue);