13

現在のスレッドをスリープ状態に保ち、このようAtomicIntegerにチェックし続ける必要がないように、待機する方法はありますかAtomicInteger

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

のようなものがあることは知っていCountDownLatchますが、それはデクリメントのみを可能にし、インクリメントできるようにするためにも必要です

さらに裏話 - スレッドを作成するループがあり、新しいスレッドを作成する前に、スレッドの実行が終了するのを待つ必要があります。しかし、私はを使用してExecutors.newFixedThreadPool(numThreads)おり、それを待機する唯一の方法は、シャットダウンメソッドを呼び出して終了を待ってから新しいスレッドプールを作成することであるように思われるため、代わりにアトミック整数を使用して、実行中および/またはオンになっているスレッドの数を追跡していましたその数が減少したときにループを続行できるようにキューを変更しました。

4

5 に答える 5

6

Semaphore実際には、探しているものに近いように見えます.1つ以上の「許可」が利用可能になるまで待つことができます. AtomicInteger使用方法を意図したものではありません。

于 2012-05-08T14:47:33.353 に答える
2

あなたが本当に欲しいのは、何らかのイベントを処理することだと思います。そのイベントは、整数をインクリメントする可能性があります。BlockingQueueを見てみましょう。

要素を取得するときにキューが空でなくなるまで待機し、要素を格納するときにキューでスペースが使用可能になるまで待機する操作を追加でサポートする Queue 。

コードは次のようになります...

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 に答える