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

📄 circularbuffer.java

📁 线程实例
💻 JAVA
字号:
import javax.swing.*;

public class CircularBuffer implements Buffer 
{
	private int buffers[]={-1,-1,-1};
	private int occupiedBufferCount=0;
	private int readLocation=0,writeLocation=0;
	private JTextArea outputArea;
	
	public CircularBuffer(JTextArea output)
	{
		outputArea=output;
	}
	
	public synchronized void set(int value)
	{
		String name=Thread.currentThread().getName();
		while(occupiedBufferCount==buffers.length)
		{
			try
			{
				SwingUtilities.invokeLater(new RunnableOutput(outputArea,"\nAll buffers full. "+name+" waits."));
				wait();
			}
			catch(InterruptedException exception)
			{
				exception.printStackTrace();
			}
		}
		
		buffers[writeLocation]=value;
		SwingUtilities.invokeLater(new RunnableOutput(outputArea,"\n"+name+" writes "+buffers[writeLocation]+" "));
		++occupiedBufferCount;
		
		writeLocation=(writeLocation+1)%buffers.length;
		SwingUtilities.invokeLater(new RunnableOutput(outputArea,creatStateOutput()));
		notify();
	}
	
	public synchronized int get()
	{
		String name=Thread.currentThread().getName();
		while(occupiedBufferCount==0)
		{
			try
			{
				SwingUtilities.invokeLater(new RunnableOutput(outputArea,"\nAll buffer empty."+name+" waits"));
				wait();
			}
			catch(InterruptedException exception)
			{
				exception.printStackTrace();
			}
		}
		
		int readValue=buffers[readLocation];
		SwingUtilities.invokeLater(new RunnableOutput(outputArea,"\n"+name+" reads "+readValue+" "));
		--occupiedBufferCount;
		readLocation=(readLocation+1)%buffers.length;
		
		SwingUtilities.invokeLater(new RunnableOutput(outputArea,creatStateOutput()));
		notify();
		return readValue;
	}
	
	public String creatStateOutput()
	{
		String output="(buffer occupied:"+occupiedBufferCount+")\nbuffers: ";
		for(int i=0;i<buffers.length;i++)
		    output+=" "+buffers[i]+" ";
		output+="\n       ";
		for(int i=0;i<buffers.length;i++)
			output+="---- ";
		output+="\n       ";
		for(int i=0;i<buffers.length;i++)
			if(i==writeLocation&&writeLocation==readLocation)
				output+=" WR ";
			else if(i==writeLocation)
				output+=" W ";
			else if(i==readLocation)
				output+=" R ";
			else
				output+="   ";
		output+="\n";
		return output;						   
	}
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -