日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发协作模型“生产者/消费者模式“

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发协作模型“生产者/消费者模式“ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • java提供了幾個方法解決線程之間的通信問題
方法名作用
wait()表示線程一直等待,直到其他線程通知,與sleep不同,會釋放鎖
wait(long timeout)指定等待的毫秒數
notify喚醒一個處于等待狀態的線程
notifyAll()喚醒同一個對象上所有調用wait()方法的線程,優先級別高的線程調度

注意:均是Object類的方法,都只能在同步方法或者同步代碼塊中使用,否則會拋出異常InterruptedException

管程法

  • 生產者:負責生產數據的模塊(可能是方法,對象,線程,進程);
  • 消費者:負責處理數據的模塊(可能是方法,對象,線程,進程);
  • 緩沖區:消費者不能直接使用生產者的數據,他們之間有個”緩沖區“
    生產者將生產好的數據放入緩沖區,消費者從緩沖區拿出數據
package com.zeng.thread; //測試:生產者消費者模型-->利用緩沖區解決:管程法 //生產者,消費者,產品,緩沖區 public class TestPC {public static void main(String[] args) {SynContainer container=new SynContainer();new Productor(container).start();new Consumer(container).start();} }//生產者 class Productor extends Thread{SynContainer container;public Productor(SynContainer container) {//構造器this.container=container;}//生產@Overridepublic void run() {for (int i = 0; i < 100; i++) {container.push(new Chicken(i));System.out.println("生產了"+i+"只雞");}} } //消費者 class Consumer extends Thread{SynContainer container;public Consumer(SynContainer container){this.container=container;}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println("消費了"+container.pop().id+"只雞");}} }//產品 class Chicken{int id;public Chicken(int id){this.id=id;} }//緩沖區 class SynContainer{//需要一個容器大小Chicken[] chickens=new Chicken[10];//容器計數int count=0;//生產者放入產品public synchronized void push(Chicken chicken){//如果容器滿了,就需要等待消費者消費if(count==chickens.length){//通知消費者消費,生產等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}chickens[count]=chicken;count++;//可以通知消費者消費了this.notifyAll();}//消費者消費產品public synchronized Chicken pop(){//判斷能否消費if(count==0){//等待生產者生產,消費者等待try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果可以消費count--;Chicken chicken=chickens[count];//吃完了,通知生產者生產this.notifyAll();return chicken;} }

信號燈法

package com.zeng.thread; //測試生產者消費者問題2:信號燈法,標志位解決 public class TestPC2 {public static void main(String[] args) {TV tv=new TV();new Player(tv).start();new Watcher(tv).start();} }//生產者:演員 class Player extends Thread{TV tv;public Player(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {if(i%2==0){this.tv.play("披荊斬棘的哥哥播放中");}else{this.tv.play("明星大偵探");}}} }//消費者:觀眾 class Watcher extends Thread{TV tv;public Watcher(TV tv){this.tv=tv;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {tv.watch();}} }//產品——>節目 class TV{//演員表演,觀眾等待T//觀眾觀看,演員等待FString voice;//表演的節目boolean flag =true;//表演public synchronized void play(String voice){if(!flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("演員表演了:"+voice);//通知觀眾觀看this.notifyAll();//通知喚醒this.voice=voice;this.flag=!this.flag;}//觀看public synchronized void watch(){if(flag){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("觀看了:"+voice);//通知演員表演this.notifyAll();this.flag=!this.flag;} }

總結

以上是生活随笔為你收集整理的并发协作模型“生产者/消费者模式“的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。