?? mpcthread0.java
字號:
/**
*1.如果線程想調用對象的wait( ), notify( ),或notifyAll( )方法,
*必須先"擁有"(得到)這個對象的鎖。
*
*2.可以讓另一個對象來操控這個對象的鎖。要想這么做,第一步是先獲取對象的鎖。
*比方說要想調用對象x的notify( ),可以在x的synchronized段里:
* synchronized(x)
* {
* x.notify();
* }
*/
class ShareData
{
private String buff=null;
private Object psyn=new Object();
private Object csyn=new Object();
public void addData(String str,String name)
{
//生產者將數據放入數據對象時,首先要判斷是否有空
//如果不空時,則要等待消費者將數據拿走
synchronized(psyn)
{
while(buff!=null)
{
try
{
psyn.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
//當空時,某一生產者將數據放入
buff=str;
System.out.println("線程"+name+"產生了");
}
//在此通知所有的消費者線程,告之數據已放入
synchronized(csyn)
{
csyn.notify();
}
}
public String removeData(String name)
{
String str=null;
//消費者從數據對象中拿數據時,首先要判斷是否有有數據
//如果沒有,則要等待生產者線程產生相應的數據
synchronized(csyn)
{
while(buff==null)
{
try{
csyn.wait();
}
catch(InterruptedException e){
e.printStackTrace();
}
}
//當有數據時,則可拿走數據
str=buff;
buff=null;
System.out.println("線程"+name+"消費了");
}
//在此通知所有的生產者線程,告之數據已拿走了
synchronized(psyn)
{
psyn.notify();
}
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 MPCThread0 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 + -