天天看點

繼續java多線程——生産者消費者類似問題

一個題目是這樣的

采用Java 多線程技術,設計實作一個符合生産者和消費者問題的程式。對一個對象(槍膛)進行操作,其最大容量是12顆子彈。生産者線程是一個壓入線程,它不斷向槍膛中壓入子彈;消費者線程是一個射出線程,它不斷從槍膛中射出子彈。(30分)

要求:

(1)給出分析過程說明。(10分)

(2)程式輸出,要模拟展現對槍膛的壓入和射出操作;(10)

(2)設計程式時應考慮到兩個線程的同步問題。(10)

這個和著名的生産者消費者問題幾乎是一樣的,與我的上篇的公告闆如出一轍,這裡再做一下分析

還是直接用代碼說話吧,注釋寫的很明白(注:代碼源自:http://dongxiao111.blog.51cto.com/2316565/534378)

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();

  }

 }

}