java多線程解決生產(chǎn)者消費(fèi)者問題
本文實(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)者問題幾乎是一樣的,這里做一下簡(jiǎn)單分析。
還是直接用代碼說話吧,注釋寫的很明白
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ì)有所幫助。
- Java多線程并發(fā)生產(chǎn)者消費(fèi)者設(shè)計(jì)模式實(shí)例解析
- Java多線程生產(chǎn)者消費(fèi)者模式實(shí)現(xiàn)過程解析
- Java多線程 生產(chǎn)者消費(fèi)者模型實(shí)例詳解
- Java多線程 BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解
- Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解
- java 中多線程生產(chǎn)者消費(fèi)者問題詳細(xì)介紹
- JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解
- 淺談java線程中生產(chǎn)者與消費(fèi)者的問題
- JAVA生產(chǎn)者消費(fèi)者(線程同步)代碼學(xué)習(xí)示例
- Java如何通過線程解決生產(chǎn)者/消費(fèi)者問題
相關(guān)文章
Java多線程Thread基礎(chǔ)學(xué)習(xí)
每一個(gè)正在執(zhí)行的程序都是一個(gè)進(jìn)程,資源只有一塊,所以在同一時(shí)間段會(huì)有多個(gè)程序同時(shí)執(zhí)行,但是在一個(gè)時(shí)間點(diǎn)上,只能由一個(gè)程序執(zhí)行,多線程是在一個(gè)進(jìn)程的基礎(chǔ)之上的進(jìn)一步劃分,需要的朋友可以參考下2023-04-04SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn)
本文主要介紹了SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程
學(xué)生信息管理系統(tǒng)是針對(duì)學(xué)校人事處的大量業(yè)務(wù)處理工作而開發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程,需要的朋友可以參考下2023-05-05SpringBoot開發(fā)案例 分布式集群共享Session詳解
這篇文章主要介紹了SpringBoot開發(fā)案例 分布式集群共享Session詳解,在分布式系統(tǒng)中,為了提升系統(tǒng)性能,通常會(huì)對(duì)單體項(xiàng)目進(jìn)行拆分,分解成多個(gè)基于功能的微服務(wù),可能還會(huì)對(duì)單個(gè)微服務(wù)進(jìn)行水平擴(kuò)展,保證服務(wù)高可用,需要的朋友可以參考下2019-07-07