Java多线程(生产者消费者实例:synchronized / lock)
一、synchronized实现publicclassTestProductorAndConsumer{publicstaticvoidmain(String[]args){Clerk clerknewClerk();Productor pronewProductor(clerk);Consumer cusnewConsumer(clerk);newThread(pro,生产者 A).start();newThread(cus,消费者 B).start();}}//店员classClerk{privateintproduct0;//进货publicsynchronizedvoidget(){while(product10){//为了避免虚假唤醒问题应该总是使用在循环中System.out.println(产品已满);try{this.wait();}catch(InterruptedExceptione){}}System.out.println(Thread.currentThread().getName() : product);this.notifyAll();}//卖货publicsynchronizedvoidsale(){while(product0){System.out.println(缺货);try{this.wait();}catch(InterruptedExceptione){}}System.out.println(Thread.currentThread().getName() : --product);this.notifyAll();}}//生产者classProductorimplementsRunnable{privateClerk clerk;publicProductor(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){try{Thread.sleep(200);}catch(InterruptedExceptione){}clerk.get();}}}//消费者classConsumerimplementsRunnable{privateClerk clerk;publicConsumer(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){clerk.sale();}}}二、lock实现publicclassConsumerProductorTest{publicstaticvoidmain(String[]args){Clerk clerknewClerk();Productor pronewProductor(clerk);Customer cusnewCustomer(clerk);newThread(pro,生產者).start();newThread(cus,消費者).start();}}classClerk{privateintproduct0;privateLock locknewReentrantLock();Condition productorlocklock.newCondition();Condition customerlocklock.newCondition();// 生产publicvoidgetProduct(){lock.lock();try{while(product10){System.out.println(产品已满);try{productorlock.await();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(Thread.currentThread().getName():product);customerlock.signalAll();}finally{lock.unlock();}}// 消费publicvoidsetProduct(){lock.lock();try{while(product0){System.out.println(缺货);try{customerlock.await();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(Thread.currentThread().getName():product--);productorlock.signalAll();}finally{lock.unlock();}}}classProductorimplementsRunnable{privateClerk clerk;publicProductor(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){clerk.getProduct();}}}classCustomerimplementsRunnable{privateClerk clerk;publicCustomer(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){clerk.setProduct();}}}二、lock实现publicclassConsumerProductorTest{publicstaticvoidmain(String[]args){Clerk clerknewClerk();Productor pronewProductor(clerk);Customer cusnewCustomer(clerk);newThread(pro,生產者).start();newThread(cus,消費者).start();}}classClerk{privateintproduct0;privateLock locknewReentrantLock();Condition productorlocklock.newCondition();Condition customerlocklock.newCondition();// 生产publicvoidgetProduct(){lock.lock();try{while(product10){System.out.println(产品已满);try{productorlock.await();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(Thread.currentThread().getName():product);customerlock.signalAll();}finally{lock.unlock();}}// 消费publicvoidsetProduct(){lock.lock();try{while(product0){System.out.println(缺货);try{customerlock.await();}catch(InterruptedExceptione){e.printStackTrace();}}System.out.println(Thread.currentThread().getName():product--);productorlock.signalAll();}finally{lock.unlock();}}}classProductorimplementsRunnable{privateClerk clerk;publicProductor(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){clerk.getProduct();}}}classCustomerimplementsRunnable{privateClerk clerk;publicCustomer(Clerk clerk){this.clerkclerk;}Overridepublicvoidrun(){for(inti0;i20;i){clerk.setProduct();}}}