?? pctest.java
字號:
import java.util.*;
//被操作的數據對象,即要被保護的數據對象
class DataBuff
{
private LinkedList buff;
public DataBuff(){
buff=new LinkedList();
}
//被同步,保證當某線程增加數據時,所有某它的線程不能對隊列的修改
public synchronized void addString(String str)
{
buff.addLast(str);
//當隊列中只有一個元素時,要想到可能有某它線程在等待
if(buff.size()==1)
{
notify();
}
}
//被同步,保證當某線程刪除數據時,所有某它的線程不能對隊列的修改
public synchronized String removeString()
{
//當隊列中沒有元素時,此線程應該等待
while(buff.size()==0)
{
try{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//當隊列中有元素時,則返回一個元素
return (String)buff.removeFirst();
}
}
//生產者線程,其目的是不斷的往隊列中增加數據
class Procedure extends Thread
{
private DataBuff buff;
public Procedure(DataBuff buff){
this.buff=buff;
start();
}
public void run()
{
int count=0;
while(true)
{
String str=new String("procedure is"+count++);
buff.addString(str);
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
//消費者線程,其目的是不斷的從隊列中取出數據
class Consumer extends Thread
{
private DataBuff buff;
public Consumer(DataBuff buff)
{
this.buff=buff;
start();
}
public void run()
{
while(true)
{
System.out.println(buff.removeString());
}
}
}
//main方法所在的類
public class PCTest
{
public static void main(String args[]) throws InterruptedException
{
//注意構造對象的方式
DataBuff buff=new DataBuff();
Procedure p=new Procedure(buff);
Consumer c=new Consumer(buff);
p.join();//等待子線程結束
c.join();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -