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

📄 pctest.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() == 5) {
			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 (count < 40) {

			String str = new String("procedure " + count++);

			buff.addString(str);

			try {
				Thread.sleep(10);
			} 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("remove: " + buff.removeString());

		}

	}
}

//main方法所在的类
public class PCTest {

	public static void main(String args[]) {

		//注意构造对象的方式
		DataBuff buff = new DataBuff();
		new Procedure(buff);
		new Consumer(buff);
	}
}

⌨️ 快捷键说明

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