java多线程解决生产者消费者问题
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
本文实例讲述了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程序设计有所帮助。
相关文章
jmeter添加自定函数的实例(jmeter5.3+IntelliJ IDEA)
这篇文章主要介绍了jmeter添加自定函数的实例(jmeter5.3+IntelliJ IDEA),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-11-11Pattern.compile函数提取字符串中指定的字符(推荐)
这篇文章主要介绍了Pattern.compile函数提取字符串中指定的字符,使用的是Java中的Pattern.compile函数来实现对指定字符串的截取,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-12-12使用dynamic datasource springboot starter实现多数据源及源码分析
这篇文章主要介绍了使用dynamic-datasource-spring-boot-starter做多数据源及源码分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-09-09Spring Boot 中常用的注解@RequestParam及基本用法
@RequestParam 是 Spring Framework 和 Spring Boot 中常用的注解之一,用于从请求中获取参数值,本文给大家介绍Spring Boot 中常用的注解@RequestParam,感兴趣的朋友一起看看吧2023-10-10关于@EnableGlobalMethodSecurity注解的用法解读
这篇文章主要介绍了关于@EnableGlobalMethodSecurity注解的用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03
最新评论