3

スレッド t1 印刷があります odd number 1 3 5 7...

スレッドt2印刷がありますeven number 0 2 4 6 ...

この2つのスレッドから出力を順番に印刷したい

 0 1 2 3 4 5 6 7

ここにコードは必要ありません Java で使用するフレームワークを教えてください。

4

3 に答える 3

4

2 つのスレッドを交互に使用する最も簡単な方法は、それぞれがjava.util.concurrent.CountDownLatch印刷後にカウント 1 のセットを作成し、もう一方のスレッドがラッチを解放するのを待つことです。

Thread A: print 0
Thread A: create a latch
Thread A: call countDown on B's latch
Thread A: await
Thread B: print 1
Thread B: create a latch
Thread B: call countDown on A's latch
Thread B: await
于 2013-02-23T20:17:30.410 に答える
1

各スレッドに1つずつ、合計2つのセマフォ。セマフォを使用して、スレッド間の「printToken」を通知します。擬似:

CreateThread(EvenThread);
CreateThread(OddThread);
Signal(EvenThread);
..
..
EvenThread();
  Wait(EvenSema);
  Print(EvenNumber);
  Signal(OddSema);
..
..
OddThread();
  Wait(OddSema);
  Print(OddNumber);
  Signal(EvenSema);
于 2013-02-23T21:14:39.003 に答える
1

私はおそらく次のようなことをします:

public class Counter
{
  private static int c = 0;

  // synchronized means the two threads can't be in here at the same time
  // returns bool because that's a good thing to do, even if currently unused
  public static synchronized boolean incrementAndPrint(boolean even)
  {
    if ((even  && c % 2 == 1) ||
        (!even && c % 2 == 0))
    {
      return false;
    }
    System.out.println(c++);
    return true;
  }
}

スレッド 1:

while (true)
{
  if (!Counter.incrementAndPrint(true))
    Thread.sleep(1); // so this thread doesn't lock up processor while waiting
}

スレッド 2:

while (true)
{
  if (!Counter.incrementAndPrint(false))
    Thread.sleep(1); // so this thread doesn't lock up processor while waiting
}

おそらく、物事を行う最も効率的な方法ではありません。

于 2013-02-23T20:17:38.537 に答える