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