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 程式設計有所幫助。