?? 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 + -