java多线程解决生产者消费者问题

 更新时间:2015年05月30日 16:47:32   作者:hitxueliang  
这篇文章主要介绍了java多线程解决生产者消费者问题的方法,实例分析了java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • Mybatis-plus如何通过反射实现动态排序不同字段功能

    Mybatis-plus如何通过反射实现动态排序不同字段功能

    这篇文章主要介绍了Mybatis-plus如何通过反射实现动态排序不同字段功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Java方法的返回值及注意事项小结

    Java方法的返回值及注意事项小结

    这篇文章主要介绍了Java方法的返回值及注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Spring boot项目打包成jar运行的二种方法

    Spring boot项目打包成jar运行的二种方法

    这篇文章主要给大家介绍了关于Spring boot项目打包成jar运行的二种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 详细解析Java中抽象类和接口的区别

    详细解析Java中抽象类和接口的区别

    这篇文章主要介绍了Java中抽象类和接口的区别详解,需要的朋友可以参考下
    2014-10-10
  • java:无法访问org.springframework.boot.SpringApplication的解决方法

    java:无法访问org.springframework.boot.SpringApplication的解决方法

    这篇文章主要给大家介绍了关于java:无法访问org.springframework.boot.SpringApplication的解决方法,文中通过实例代码将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java网络编程之TCP程序设计

    Java网络编程之TCP程序设计

    这篇文章主要为大家详细介绍了Java网络编程之TCP程序设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Spring Boot监控SQL运行情况的全过程

    Spring Boot监控SQL运行情况的全过程

    这篇文章主要给大家介绍了关于Spring Boot监控SQL运行情况的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Java中ArrayList类的用法与源码完全解析

    Java中ArrayList类的用法与源码完全解析

    这篇文章主要介绍了Java中ArrayList类的用法与源码完全解析,ArrayList类通过List接口实现,是Java中引申出的一种数据结构,需要的朋友可以参考下
    2016-05-05
  • 以Java Web项目为例浅谈前后端分离开发模式

    以Java Web项目为例浅谈前后端分离开发模式

    这篇文章主要介绍了以Java Web项目为例浅谈前后端分离开发模式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • java中stream去重的几种方式举例

    java中stream去重的几种方式举例

    Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列,这篇文章主要给大家介绍了关于java中stream去重的几种方式,需要的朋友可以参考下
    2023-07-07

最新评论