アブドラカーン:
私は最近、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 Thread
でelse
のブロック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);
}
}
}
スレッドを作成した後、その開始前に、あなたはフィールドを割り当てる必要がありますname
とnext
。私はこの自分自身をプログラムすることができると信じて。また、最初のスレッドが初期値で提供されなければなりません1
。