14.4 线程通讯-生产者与消费者
生活随笔
收集整理的這篇文章主要介紹了
14.4 线程通讯-生产者与消费者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package cn.chen.threadcommunication;
/*
線程通訊:一個線程完成了自己的任務時,要通知另外一個線程去完成另一個任務。生產者與消費者wait(); 等待如果線程執行了wait方法,那么該線程會進入等待的狀態,
等待狀態下的線程必須要被其他線程調用notify方法才能喚醒。
notify(); 喚醒 喚醒等待線程。wait與notify方法要注意的事項:1.wait方法與notify方法是屬于Object對象的。2.wait方法與notify方法必須要同步代碼或者是在同步函數中才能使用。3.wait與notify方法必須要鎖對象來調用。線程安全問題:* */
class Product{//產品類String name;double price;boolean flag = false; //產品是否生產的標志
}
class Producer extends Thread{//生產者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("生產者生產了:"+p.name+"它的價格是:"+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{//消費者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){//產品已經生產System.out.println("消費者消費了"+p.name+"價格:"+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();}}
總結
以上是生活随笔為你收集整理的14.4 线程通讯-生产者与消费者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14.3 线程实现方法2
- 下一篇: 14.6 设置后台线程