多线程生产消费者示例

来自尚硅谷视频
生产者将产品交给店员,而消费者从店员处取走产品
店员一次只能持有固定数量产品(比如20),如果生产者试图生产更多产品,店员会叫生产者停一下,
如果店中有空位放产品,再通知生产者继续生产,如果店中没有产品,店员会告诉消费者等一下,如果店中有产品再通知消费者来取走产品。
问题分析: 是否是对线程问题? 是,生产者、消费者
      是否共享数据?是,店员、产品
      是否涉及线程通信? 是
      如何解决线程安全问题?同步机制
    


//共享数据模块
class Clerk {
private int counter = 0;

// 从生产者获取产品
public synchronized void product() {
if (counter < 20) {
notify();
counter++;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":开始生产第" + counter + "个产品");
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//给顾客提供产品
public synchronized void sale() {
if (counter > 0) {
notify();

System.out.println(Thread.currentThread().getName() + ":开始消费第" + counter + "个产品");
counter--;
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Producter extends Thread {
private Clerk clerk;

public Producter(Clerk clerk) {
this.clerk = clerk;
}
//生产产品
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.clerk.product();
}
}
}

class Custom extends Thread {
private Clerk clerk;

public Custom(Clerk clerk) {
this.clerk = clerk;
}
//消费产品
public void run() {
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.clerk.sale();
}
}
}

public class Thread007 {
public static void main(String[] args) {
Clerk clerk=new Clerk();
Producter producter=new Producter(clerk);
producter.setName("生产者");
Custom custom = new Custom(clerk);
custom.setName("消费者一");
Custom custom1 = new Custom(clerk);
custom1.setName("消费者二");
producter.start();
custom.start();
custom1.start();
}
}

猜你喜欢

转载自www.cnblogs.com/kukai/p/12589566.html
今日推荐