该例子用于测试多线程中的wait方法和notify方法,以及同步方法
package testthread;
/**
* 店员从生产者取货,消费者从店员取货,店员最多只能存放20个产品,当产品不够20个需通知生产者生产,超过20个时停止消费
* @author Passenger
*
*/
//店员类
class Clerk {
int proNum;
//添加产品
public synchronized void addProduct(){
if(proNum>=20){
try {
//如果产品超过20件就停止生产
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
proNum++;
System.out.println(Thread.currentThread().getName() + " 生产了产品,还剩下: " + proNum);
//生产了商品后唤醒消费者去消费
notifyAll();
}
}
//消费产品
public synchronized void conProduct(){
if(proNum<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
proNum--;
System.out.println(Thread.currentThread().getName() + " 消费了产品,还剩下: " + proNum);
notifyAll();
}
}
}
//新建一个生产者类
class Productor implements Runnable{
//new一个clerk对象,用于操作clerk对象中的proNum
Clerk clerk = null;
public Productor(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
while(true){
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.addProduct();
}
}
}
//消费者类
class Consumer implements Runnable {
Clerk clerk = null;
public Consumer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.conProduct();
}
}
}
public class TestProduce1 {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Consumer consumer = new Consumer(clerk);
Productor productor = new Productor(clerk);
//生产者和消费者线程
Thread conThread = new Thread(consumer);
Thread proThread = new Thread(productor);
//设置线程名
conThread.setName("conThread");
proThread.setName("proThread");
//开始执行多线程
conThread.start();
proThread.start();
}
}