首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多執行緒實作生產者消費者模式

     編輯:Java 相關知識

Java 多執行緒實作生產者消費者模式。本站提醒廣大學習愛好者:此文章僅供參考,不一定能完全符合您的需求。以下是完整實作正文


本文範例說明 Java 多執行緒處理生產者消費者問題的方法。分享給大家供參考。詳細分析如下:

題目如下:

採用 Java 多執行緒技術,設計實作一個符合生產者和消費者問題的程式。對一個物件(彈夾)進行操作,其最大容量是 12 顆子彈。生產者執行緒是一個壓入執行緒,它持續向彈夾中壓入子彈;消費者執行緒是一個射出執行緒,它持續從彈夾中射出子彈。

要求:
(1)給出分析過程解釋。
(2)程式輸出,要模擬顯示對彈夾的壓入和射出操作;
(3)設計程式時應考慮到兩個執行緒的同步問題。

這個和經典的生產者消費者問題幾乎一樣,這裡做一下簡單分析。直接用程式碼說明,正文寫得很清楚。

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;

    public synchronized void put(List list) {
        if (!bFull) {
            this.list = list;
            bFull = true;
            notify();
        }
        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 + " 顆子彈");
        }
        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++) {
            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 程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved