14.4 线程通讯-生产者与消费者
生活随笔
收集整理的這篇文章主要介紹了
14.4 线程通讯-生产者与消费者
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
package cn.chen.threadcommunication;
/*
線程通訊:一個(gè)線程完成了自己的任務(wù)時(shí),要通知另外一個(gè)線程去完成另一個(gè)任務(wù)。生產(chǎn)者與消費(fèi)者wait(); 等待如果線程執(zhí)行了wait方法,那么該線程會(huì)進(jìn)入等待的狀態(tài),
等待狀態(tài)下的線程必須要被其他線程調(diào)用notify方法才能喚醒。
notify(); 喚醒 喚醒等待線程。wait與notify方法要注意的事項(xiàng):1.wait方法與notify方法是屬于Object對(duì)象的。2.wait方法與notify方法必須要同步代碼或者是在同步函數(shù)中才能使用。3.wait與notify方法必須要鎖對(duì)象來調(diào)用。線程安全問題:* */
class Product{//產(chǎn)品類String name;double price;boolean flag = false; //產(chǎn)品是否生產(chǎn)的標(biāo)志
}
class Producer extends Thread{//生產(chǎn)者Product p;public Producer(Product p){this.p = p;}@Overridepublic void run() {// TODO Auto-generated method stubint i =0;while(true){synchronized (p) {if(p.flag == false){if(i%2 == 0){p.name = "apple";p.price = 4000;}else{p.name = "hu wei";p.price = 1999;}System.out.println("生產(chǎn)者生產(chǎn)了:"+p.name+"它的價(jià)格是:"+p.price);p.flag = true;p.notify();i++;}else{try {p.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
}
class Customer extends Thread{//消費(fèi)者Product p;public Customer(Product p) {// TODO Auto-generated constructor stubthis.p = p;}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){synchronized (p) {if(p.flag){//產(chǎn)品已經(jīng)生產(chǎn)System.out.println("消費(fèi)者消費(fèi)了"+p.name+"價(jià)格:"+p.price);p.flag = false;p.notify();}else{try {p.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }
}
public class Demo {public static void main(String[] args) {// TODO Auto-generated method stubProduct p = new Product();Producer per = new Producer(p);Customer c = new Customer(p);per.start();c.start();}}
總結(jié)
以上是生活随笔為你收集整理的14.4 线程通讯-生产者与消费者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14.3 线程实现方法2
- 下一篇: 14.6 设置后台线程