码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-27 12:59:54      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ccc on 16-4-27.
 */
public class Test {

    public static void main(String[] args) {
        GunClip clip = new GunClip();
        Producer p = new Producer(clip);
        customer c = new customer(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 < 1; 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 customer extends Thread {
    private GunClip clip;

    customer(GunClip clip) {
        this.clip = clip;
    }

    public void run() {
        while (true) {
            clip.get();
        }
    }
}

上边代码主要介绍了java多线程解决生产者消费者问题的方法,实例分析了java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下

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

标签:

原文地址:http://www.cnblogs.com/baizhanshi/p/5438104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!