特定の順序で唯一の5スレッドを1から10までの整数を印刷

アブドラカーン:

私は最近、Javaでマルチスレッドを開始しました

私は私が唯一の5持っている問題解決の問題を持っているスレッドに至るまでT1、T2、... T5を

タスクは、次の順序で1から10までの数字を印刷することです。

T1 -> 1
T2 -> 2
T3 -> 3
T4 -> 4
T5 -> 5
T1 -> 6
T2 -> 7
T3 -> 8
T4 -> 9
T5 -> 10

私は、コードのこの部分でそれを解決しようとしました。

public static void main(String[] args) throws InterruptedException {
    Counter counter = new Counter();
    Thread[] tArray = new Thread[] { new Thread(counter, "T1"), new Thread(counter, "T2"),
            new Thread(counter, "T3"), new Thread(counter, "T4"), new Thread(counter, "T5") };
    for (int i = 0; i < 10; i++) {
        if (i < 5) {
            tArray[i].start();
            tArray[i].join();
        } else {
            tArray[i - 5] = new Thread(counter, "T" + ((i - 5) + 1)); //Instantiating new Thread which is not allowed.
            tArray[i - 5].start();
            tArray[i - 5].join();
        }
    }
}

public class Counter implements Runnable {

    private int count = 0;

    @Override
    public synchronized void run() {
       System.out.println(Thread.currentThread().getName() + " -> " + ++count);
    }

}

唯一の5スレッドが許可されているので、私もインスタンス化していますので、しかし、私の解決策を受け入れられないnew Threadelseのブロックforのループ。

すべてのヘルプは高く評価されるだろう。

Alexei Kaigorodov :

あなたは、スレッド間の相互作用を整理する必要があります。スレッドの相互作用のための最も自然な方法は、スレッドを接続キューをブロックする設定されています。キューは、独立したオブジェクトであるか、または特定のスレッドに属することができます。あなたのケースでは、あなたは5つのスレッドの円を作成する必要があります。

class CountPrinter extends Thread {
   String name;
   ArrayBlockingQueue<Integer> inp = new ArrayBlockingQueue<>();
   CountPrinter next;

   public void run() {
      for (;;)
         int n = inp.take();
         if (n == 11) {// only 10 numbers must be printed
            next.inp.put(11);
            return;
         }
         System.out.println(name+"->"+n);
         next.inp.put(n+1);
      }
   }
}

スレッドを作成した後、その開始前に、あなたはフィールドを割り当てる必要がありますnamenext私はこの自分自身をプログラムすることができると信じて。また、最初のスレッドが初期値で提供されなければなりません1

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=175667&siteId=1