⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pctest.java

📁 在学习Java的多线程时
💻 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 + -