java中的多线程

来源:互联网 发布:水质监测数据分析 编辑:程序博客网 时间:2024/06/05 16:11

该例子用于测试多线程中的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();

}


}


0 0