刚刚接触多线程问题和开发,一些简单,狭隘的想法还请读者指教。
原题截图不方便上传,题目大概如下;
系统中有是哪个进程,Producer,Transmitter和Consumer,P和T共用一个缓冲区ProduceBuf, T和C公用一个缓冲区ConsumeBuf。
其流程如下图:其中ProduceBuf最多放12个信息,现已放入3个;ConsumeBuf最多放6个信息。
大概的想法使用传统生产者消费者问题的解法 用wait() notify() 解决问题代码如下:
public class AdvanceCP {
public static void main(String[] args) {
// TODO Auto-generated method stub
AdvanceCP ad = new AdvanceCP();
ProduceBuf pb = ad.new ProduceBuf();
ConsumeBuf cb = ad.new ConsumeBuf();
Producer p = ad.new Producer(pb);
Transmitter t = ad.new Transmitter(pb,cb);
Consumer c = ad.new Consumer(cb);
Thread tp = new Thread(p);
Thread tt = new Thread(t);
Thread tc = new Thread(c);
tc.start();
tt.start();
tp.start();
}
class ProduceBuf {
int index = 0;
Integer[] buffer = new Integer[12];
public synchronized void produce(){
while(index==buffer.length){
//buffer is full
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
int newInt = (int) (Math.random()*100);
buffer[index] = newInt;
System.out.println("Producing a new object."+newInt);
index++;
this.notify();
}
public synchronized Integer pop(){
while(index==0) {
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
index--;
System.out.println("Transmitting a new object."+buffer[index]);
return buffer[index];
}
}
class ConsumeBuf {
int index = 0;
Integer[] buffer = new Integer[6];
public synchronized void push(Integer newint){
while(index==buffer.length){
//buffer is full
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
buffer[index] = 0-newint;
System.out.println("Transmitted a new object."+buffer[index]);
index++;
this.notify();
}
public synchronized Integer pop(){
while(index==0) {
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
index--;
System.out.println("Consuming a new object."+buffer[index]);
return buffer[index];
}
}
class Producer extends Thread{
ProduceBuf pb =null;
Producer(ProduceBuf p){
pb = p;
}
public void run(){
while(true){
pb.produce();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Transmitter extends Thread{
ProduceBuf pb = null;
ConsumeBuf cb = null;
Transmitter(ProduceBuf p,ConsumeBuf c){
pb = p;
cb =c;
}
public void run(){
while(true){
cb.push(pb.pop());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
ConsumeBuf cb = null;
Consumer(ConsumeBuf c){
cb=c;
}
public void run(){
while(true){
cb.pop();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
根据三个进程sleep的时间不同,会出现死锁情况,即程序没有正常持续工作,个人觉得认为可能是Transmitter进程无法同时获得两个缓冲区的锁进行工作,正在思考解决办法,也希望有想法的可以指教。
更新:
注释掉sleep()方法似乎让程序跑起来更像一个多线程程序。