📄 mpcthread.java
字号:
class ShareData
{
private String buff=null;
public synchronized void addData(String str,String name)
{
//生产者将数据放入数据对象时,首先要判断是否有空
//如果不空时,则要等待消费者将数据拿走
while(buff!=null)
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
//当空时,某一生产者将数据放入
buff=str;
System.out.println("线程"+name+"产生了");
//在此通知所有的消费者线程,告之数据已放入
notifyAll();
}
public synchronized String removeData(String name)
{
//消费者从数据对象中拿数据时,首先要判断是否有有数据
//如果没有,则要等待生产者线程产生相应的数据
while(buff==null)
{
try{
wait();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
//当有数据时,则可拿走数据
String str=buff;
buff=null;
System.out.println("线程"+name+"消费了");
//在此通知所有的生产者线程,告之数据已拿走了
notifyAll();
return str;
}
}
//生产者线程,其目的是不断的往队列中增加数据
class Procedure extends Thread{
private ShareData buff;
//在创建线程时,给出数据对象和线程自己的名称
public Procedure(ShareData buff,String name){
this.buff=buff;
setName(name);
start();
}
public void run(){
int count=0;
while(true){
String str=new String("procedure is"+count++);
String name=getName();
//每个线程调用数据对象的方法时,都给出自己的名称
buff.addData(str,name);
try{
Thread.sleep(2000);
}
catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
//消费者线程,其目的是不断的从队列中取出数据
class Consumer extends Thread{
private ShareData buff;
//在创建线程时,给出数据对象和线程自己的名称
public Consumer(ShareData buff,String name){
this.buff=buff;
setName(name);
start();
}
public void run(){
while(true){
String name=getName();
//每个线程调用数据对象的方法时,都给出自己的名称
buff.removeData(name);
}
}
}
public class MPCThread extends Thread{
public static void main(String args[]) throws InterruptedException
{
//注意构造对象的方式
ShareData buff=new ShareData();
Procedure p1=new Procedure(buff,"生产者1");
Procedure p2=new Procedure(buff,"生产者2");
Procedure p3=new Procedure(buff,"生产者3");
Procedure p4=new Procedure(buff,"生产者4");
Consumer c1=new Consumer(buff,"消费者1");
Consumer c2=new Consumer(buff,"消费者2");
Consumer c3=new Consumer(buff,"消费者3");
Consumer c4=new Consumer(buff,"消费者4");
p1.join();
p2.join();
p3.join();
p4.join();
c1.join();
c2.join();
c3.join();
c4.join();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -