本文實例講述了java多線程解決生產者消費者問題的方法。分享給大家供大家參考。具體分析如下:
題目是這樣的:
采用Java 多線程技術,設計實現一個符合生產者和消費者問題的程序。對一個對象(槍膛)進行操作,其最大容量是12顆子彈。生產者線程是一個壓入線程,它不斷向槍膛中壓入子彈;消費者線程是一個射出線程,它不斷從槍膛中射出子彈。
要求:
(1)給出分析過程說明。
(2)程序輸出,要模擬體現對槍膛的壓入和射出操作;
(2)設計程序時應考慮到兩個線程的同步問題。
這個和著名的生產者消費者問題幾乎是一樣的,這里做一下簡單分析。
還是直接用代碼說話吧,注釋寫的很明白
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(); }}/* 首先我要有一個彈夾,*/class GunClip //彈夾 { private List<Integer> list=null;//用來放子彈 private boolean bFull =false ; //理解boolean變量很重要,表示滿沒滿 //函數功能,像彈夾中放子彈 public synchronized void put(List list){ if(!bFull){//意思是說彈夾沒有滿,那么就像里面放子彈 this.list=list; bFull=true;//放滿了子彈,在把boolean變量變為true表示,彈夾滿了 notify();//通知,等待取子彈的線程來取子彈 } //下面的try中得wait是當彈夾滿了的情況下, //即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"+"機槍開始射出子彈:"+"/n"); for(int i=list.size();i>0;i--){ int j=(Integer)list.get(i-1); System.out.println("已射出第"+j+"顆子彈"); } //彈夾被取空了,即沒子彈了,那么只能等待重新填充, //所以boolean變為false,表示沒滿,通知裝子彈的線程裝子彈 bFull=false; notify(); }}//生產者,即裝子彈,下面和公告板差不多,要有一個彈夾的實體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++){ //讓它生產3個彈夾 list=new ArrayList(); System.out.println("/n"+"機槍開始壓入子彈:"+"/n"); for(int j=0;j<12;j++){ list.add(j+1); System.out.println("已壓入第"+(j+1)+"顆子彈"); } clip.put(list); } } }//消費者,發射子彈class Concumer extends Thread{ private GunClip clip; Concumer(GunClip clip){ this.clip=clip; } public void run(){ while(true){ clip.get(); } }}
希望本文所述對大家的java程序設計有所幫助。
新聞熱點
疑難解答