java多线程生产者消费者问题_java多线程解决生产者消费者问题
发布日期:2022-02-03 15:24:57 浏览次数:5 分类:技术文章

本文共 1884 字,大约阅读时间需要 6 分钟。

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

转载地址:https://blog.csdn.net/weixin_35600779/article/details/114080094 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql实现评论盖楼的sql_mysql - 网易的评论盖楼设计,用php的话,应该怎样实现?怎样存入数据库?...
下一篇:c 批量更新mysql数据库_MySql批量更新方式大全

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 02时10分59秒