欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年05月30日 16:47:32   作者:hitxueliang  
這篇文章主要介紹了java多線程解決生產(chǎn)者消費(fèi)者問題的方法,實(shí)例分析了java采用多線程的方法解決生產(chǎn)者消費(fèi)者問題的相關(guān)技巧,需要的朋友可以參考下

本文實(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ì)有所幫助。

相關(guān)文章

  • 淺談java定時(shí)器的發(fā)展歷程

    淺談java定時(shí)器的發(fā)展歷程

    這篇文章主要介紹了淺談java定時(shí)器的發(fā)展歷程,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java多線程Thread基礎(chǔ)學(xué)習(xí)

    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-04
  • Java中的類初始化解析

    Java中的類初始化解析

    這篇文章主要介紹了Java中的類初始化解析,類的初始化是一個(gè)Java類生命周期中的其中一個(gè)階段,初始化是類加載的最后一個(gè)階段,也正是在初始化階段,才會(huì)真正開始執(zhí)行類中所寫的Java代碼,需要的朋友可以參考下
    2023-08-08
  • Spring詳細(xì)解讀事務(wù)管理

    Spring詳細(xì)解讀事務(wù)管理

    Spring事務(wù)的本質(zhì)就是對(duì)數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實(shí)現(xiàn)都是由數(shù)據(jù)庫自己實(shí)現(xiàn)的,Spring會(huì)在事務(wù)開始時(shí),根據(jù)當(dāng)前設(shè)置的隔離級(jí)別,調(diào)整數(shù)據(jù)庫的隔離級(jí)別,由此保持一致
    2022-04-04
  • java中如何對(duì)Map的key順序排序

    java中如何對(duì)Map的key順序排序

    大家都知道Map排序的方式有很多種,下面這篇文章主要給大家介紹了關(guān)于java中如何對(duì)Map的key順序排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java中Switch的使用方法及新特性

    Java中Switch的使用方法及新特性

    在java中控制流程語句是由選擇語句、循環(huán)語句、跳轉(zhuǎn)語句構(gòu)成,選擇語句包括if和switch,在過多的使用if語句嵌套會(huì)使程序很難閱讀,這時(shí)就可以用到switch語句,這篇文章主要給大家介紹了關(guān)于Java中Switch的使用方法及新特性的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn)

    SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn)

    本文主要介紹了SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • java獲取服務(wù)器基本信息的方法

    java獲取服務(wù)器基本信息的方法

    這篇文章主要介紹了java獲取服務(wù)器基本信息的方法,涉及java獲取系統(tǒng)CPU、內(nèi)存及操作系統(tǒng)等相關(guān)信息的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程

    JavaWeb實(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-05
  • SpringBoot開發(fā)案例 分布式集群共享Session詳解

    SpringBoot開發(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

最新評(píng)論