<span style="font-size:14px;">package cn.edu.qianfeng;
/*
* 生产者与消费者问题需要考虑以下几个问题:
* 1.是否涉及到多线程问题?
* 答:是! 生产者、消费者
* 2.是否涉及到共享数据?
* 答:是! 产品的数量。有共享数据就要考虑线程的安全问题
* 3.是否涉及到线程的通信?
* 答:是! 存在生产者和消费者之间的通信--同步(<span style="font-family: Arial, Helvetica, sans-serif;">synchronized)</span>
*/
public class 生产者与消费者 {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer p = new Producer(clerk);
Consumer c = new Consumer(clerk);
Thread t1 = new Thread(p, "生产者1");
Thread t2 = new Thread(p, "生产者2");
Thread t3 = new Thread(c, "消费者1");
t1.start();
t2.start();
t3.start();
}
}
/*
* 店员
*/
class Clerk{
int product; //产品的数量(共享数据)
//生产产品(因为涉及到共享数据,所以要声明为同步方法)
public synchronized void addProduct(){
if (product >= 20) {
try {
wait(); //等待,释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
product ++;
System.out.println(Thread.currentThread().getName() + "生产了第" + product + "个产品");
notifyAll(); //唤醒消费者线程
}
}
//消费产品(因为涉及到共享数据,所以要声明为同步方法)
public synchronized void consumeProduct(){
if (product <= 0) {
try {
wait(); //等待,释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName() + "消费了第" + product + "个产品");
product --;
notifyAll(); //唤醒生产者线程
}
}
}
/*
* 生产者
*/
class Producer implements Runnable{
Clerk clerk;
public Producer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始生产产品");
while (true) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.addProduct();
}
}
}
/*
* 消费者
*/
class Consumer implements Runnable{
Clerk clerk;
public Consumer(Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始消费产品");
while (true) {
try {
Thread.currentThread().sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumeProduct();
}
}
}</span>
转载请注明原文地址: https://ju.6miu.com/read-1297469.html