多线程编码实现生产者消费者问题
package test; /** * 生产者消费者问题实现,消费时不生产,生产时不消费 * on date:2019/10/24 * 找工作期间没事干 */ public class productAndCustomer { public static void main(String[] args) { Clerk clerk=new Clerk(); //生产线程 Product product=new Product(clerk); product.start(); //消费线程 Customer customer=new Customer(clerk); customer.start(); } } /** * 店员类 */ class Clerk{ public static int productNum=0; } /** * 生产类 */ class Product extends Thread { private Clerk clerk; public Product( Clerk clerk){ this.clerk=clerk; } @Override public void run() { synchronized (clerk){ while (true){ if(clerk.productNum==0){ //没产品了,生产产品,消费线程等待 System.out.println("---产品 0 生产...... ---"); while (clerk.productNum<6){ System.out.println("生产库存:"+clerk.productNum); clerk.productNum++; } System.out.println("生产结束:"+clerk.productNum); //唤醒消费线程 System.out.println("--- 唤醒消费线程 ---"); clerk.notify(); }else { try { //有,等待不生产,生产者线程等待 System.out.println("--- 生产者线程等待 ---"); clerk.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } /** * 客户类 */ class Customer extends Thread { private Clerk clerk; public Customer(Clerk clerk){ this.clerk=clerk; } @Override public void run() { synchronized (clerk){ while (true){ if(clerk.productNum==6){ //有产品,可以进行消费 while (clerk.productNum>0){ System.out.println("消费库存:"+clerk.productNum); clerk.productNum--; } System.out.println("消费结束:"+clerk.productNum); //唤醒生产线程 System.out.println("--- 唤醒生产线程 ---"); clerk.notify(); }else { try { //没产品,消费线程等待 System.out.println("--- 消费线程等待 ---"); clerk.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }

注意 :多线程中如果实现了Runnable接口的类调用run方法 只会当做普通的对象方法执行,并不会创建一个新线程。也就是说程序只会按顺序执行,
Runnable 正确调用是:
Runnable1 r1 = new Runnable1();
new Thread(r1).start();
而非
r1.run() ;

浙公网安备 33010602011771号