/**
* 生产者与消费者问题
* 涉及到了线程通信,线程同步,线程安全问题
分析:
* 1.是否是多线程问题:是,生产者线程与消费者线程
* 2.是否有共享数据:是
* 3.是否有安全问题:是
* 4.需要考虑如何解决线程安全问题:是
*/
public class Product {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer producer = new Producer(clerk);
Consumer consumer = new Consumer(clerk);
producer.setName("producer");
consumer.setName("consumer");
producer.start();
consumer.start();
}
}
class Clerk{
private int productNum = 0;
public synchronized void product() {
// TODO Auto-generated method stub
if(productNum < 20 ) {
productNum++;
System.out.println(Thread.currentThread().getName() + ":开始生产第"+productNum+"产品");
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized void consum() {
// TODO Auto-generated method stub
if(productNum > 0 ) {
System.out.println(Thread.currentThread().getName() + ":开始消费第"+productNum+"产品");
productNum--;
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
System.out.println(getName()+ "生产产品。。。。。。" );
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.product();
}
}
}
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
public void run() {
System.out.println(getName()+ "消费产品。。。。。。" );
while(true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.consum();
}
}
}
多线程之生产者消费者问题
最新推荐文章于 2021-01-11 11:40:30 发布