【发布时间】:2017-12-25 05:31:27
【问题描述】:
目标:创建两个线程,使生产者和消费者线程可以互换工作,即如果第一个线程充当生产者,第二个线程充当消费者,反之亦然。
详细说明:它们通过缓冲区相互通信,存储一个整数大小。例如,如果第一个线程产生 1,那么第二个线程消耗它并产生 2,然后第一个线程消耗 2 并产生接下来的三个整数,消费者一个接一个地消耗它们。 之后两个线程都终止。 此外,两个线程都应该能够发起通信。
我尝试编写以下代码。
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
但我得到以下输出 输出
sent :1
received :2
57
4
13
如果代码中的任何更正或有关如何以替代方式解决给定问题的任何想法,请提出建议。提前谢谢您。
【问题讨论】:
-
你如何使用等待是错误的。请参阅 oracle 教程,我也有多个关于它的 SO 答案。同样将锁定代码放在任务中而不是将其放在通用数据结构中似乎是个坏主意。你把应该简单的东西弄复杂了。无视代码约定也不好。
标签: java multithreading producer-consumer