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

时间:2012-05-08 14:34:03

标签: java multithreading atomic

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

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

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

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

  

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

代码看起来像......

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我认为与你想要的更接近的是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);

答案 4 :(得分:0)

具有 CompletableFuture

的简单解决方案

创建CompletableFuture,这两个线程都可以访问线程1,线程2

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

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

Integer value = future.join();

计算线程2中的值并完成未来

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