目的:プロデューサとコンシューマスレッドが互換性を持つように2つのスレッドを作成する。Javaマルチスレッドプログラムでプロデューサコンシューマスレッドの交換可能な役割
詳細:バッファを介して互いに通信します.1つの整数サイズを格納します。例えば、最初のスレッドが1を生成した場合、2番目のスレッドはそれを消費して2を生成し、次に1番目のスレッドは2を消費し、次の3つの整数を生成し、Consumerはそれらを1つずつ消費します。 その後、両方のスレッドが終了します。 また、両方のスレッドが通信を開始できる必要があります。
次のコードを書き込もうとしました。
import java.util.Random;
class CommonItem {
boolean flag = false;
int arr[];
public synchronized void Send(String msg) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
flag = true;
notify();
}
public synchronized void Receive(String msg) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
arr = send_random();
for (int item: arr) {
System.out.println(item);
}
flag = false;
notify();
}
synchronized int[] send_random(){
int[] arr = new int[3];
Random random= new Random();
for (int i = 0; i < 3; i++) {
arr[i]=random.nextInt(100);
}
return arr;
}
}
class T1 implements Runnable {
CommonItem Ci;
public T1(CommonItem Ci) {
this.Ci = Ci;
new Thread(this, "producer").start();
}
public void run() {
while (true)
Ci.Send("sent :1");
}
}
class T2 implements Runnable {
CommonItem Ci;
public T2(CommonItem m2) {
this.Ci = m2;
new Thread(this, "Consumer").start();
}
public void run() {
while (true)
Ci.Receive("received :2");
}
}
public class TestClass {
public static void main(String[] args) {
CommonItem m = new CommonItem();
new T1(m);
new T2(m);
}
}
予想される出力は
sent :1
received :1
sent :2
received :2
sent :57 4 13
received :57 4 13
あるしかし、私は次の出力に OUTPUT
sent :1
received :2
57
4
13
を取得示唆してくださいコード内の任意の修正またはどのように上の任意のアイデアであれば与えられた問題を別の方法で解く。前もって感謝します。第による最初の25 6 57
受信素子によって
どのように待ち時間が間違って使用します。 Oracleのチュートリアルを参照してください、私もそれについて複数の答えがあります。また、共通のデータ構造に置くのではなく、タスクにロッキングコードを置くことは悪い考えです。シンプルで複雑なものを取った。また、コード規約を無視することは良くありません。 –