国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java多線程解決生產(chǎn)者消費(fèi)者問題

2019-11-26 15:10:17
字體:
供稿:網(wǎng)友

本文實(shí)例講述了java多線程解決生產(chǎn)者消費(fèi)者問題的方法。分享給大家供大家參考。具體分析如下:

題目是這樣的:

采用Java 多線程技術(shù),設(shè)計(jì)實(shí)現(xiàn)一個(gè)符合生產(chǎn)者和消費(fèi)者問題的程序。對(duì)一個(gè)對(duì)象(槍膛)進(jìn)行操作,其最大容量是12顆子彈。生產(chǎn)者線程是一個(gè)壓入線程,它不斷向槍膛中壓入子彈;消費(fèi)者線程是一個(gè)射出線程,它不斷從槍膛中射出子彈。

要求:

(1)給出分析過程說明。
(2)程序輸出,要模擬體現(xiàn)對(duì)槍膛的壓入和射出操作;
(2)設(shè)計(jì)程序時(shí)應(yīng)考慮到兩個(gè)線程的同步問題。

這個(gè)和著名的生產(chǎn)者消費(fèi)者問題幾乎是一樣的,這里做一下簡單分析。

還是直接用代碼說話吧,注釋寫的很明白

package test;import java.util.ArrayList;import java.util.List;public class testGun { public static void main(String[] args)  { GunClip clip=new GunClip(); Producer p=new Producer(clip); Concumer c=new Concumer(clip); p.start(); c.start(); }}/* 首先我要有一個(gè)彈夾,*/class GunClip   //彈夾   { private List<Integer> list=null;//用來放子彈 private boolean bFull =false ; //理解boolean變量很重要,表示滿沒滿 //函數(shù)功能,像彈夾中放子彈 public synchronized void put(List list){ if(!bFull){//意思是說彈夾沒有滿,那么就像里面放子彈  this.list=list;  bFull=true;//放滿了子彈,在把boolean變量變?yōu)閠rue表示,彈夾滿了  notify();//通知,等待取子彈的線程來取子彈 } //下面的try中得wait是當(dāng)彈夾滿了的情況下, //即boolean為true,暫停本線程,等待取子彈 try{  wait(); }catch(Exception e){  e.printStackTrace(); } } public synchronized void get(){ if(!bFull){//如果彈夾沒滿那么就不能取子彈  try{  wait();//彈夾沒滿,所以取不了,只能等待,只有彈夾滿了才能取  }catch(Exception e){  e.printStackTrace();   } } //下面是彈夾滿了,那么我開始取子彈 System.out.println("/n"+"機(jī)槍開始射出子彈:"+"/n"); for(int i=list.size();i>0;i--){      int j=(Integer)list.get(i-1);  System.out.println("已射出第"+j+"顆子彈"); } //彈夾被取空了,即沒子彈了,那么只能等待重新填充, //所以boolean變?yōu)閒alse,表示沒滿,通知裝子彈的線程裝子彈 bFull=false; notify(); }}//生產(chǎn)者,即裝子彈,下面和公告板差不多,要有一個(gè)彈夾的實(shí)體class Producer extends Thread{ private GunClip clip; private List<Integer> list; Producer(GunClip clip){ this.clip=clip; } public void run(){ for(int i=0;i<3;i++){ //讓它生產(chǎn)3個(gè)彈夾  list=new ArrayList();  System.out.println("/n"+"機(jī)槍開始?jí)喝胱訌棧?+"/n");  for(int j=0;j<12;j++){  list.add(j+1);  System.out.println("已壓入第"+(j+1)+"顆子彈");  }  clip.put(list);  } } }//消費(fèi)者,發(fā)射子彈class Concumer extends Thread{  private GunClip clip; Concumer(GunClip clip){ this.clip=clip; } public void run(){ while(true){  clip.get(); } }}

希望本文所述對(duì)大家的java程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江川县| 郑州市| 宜春市| 西吉县| 兴业县| 饶阳县| 全南县| 抚松县| 东港市| 醴陵市| 岚皋县| 台湾省| 新沂市| 和田县| 高邑县| 托克逊县| 河北省| 新和县| 习水县| 乐清市| 饶河县| 海口市| 新疆| 永登县| 泰来县| 巴马| 平邑县| 托里县| 新竹市| 威宁| 阿拉善盟| 广饶县| 周宁县| 东台市| 丰县| 永州市| 墨竹工卡县| 乐都县| 抚远县| 安龙县| 治多县|