"多线程的例子"包括了多线程的各个方面
源代码在线查看: 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() == 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);
}
}