當前位置:編程學習大全網 - 編程語言 - java使用哪些類實現生產消費者模型

java使用哪些類實現生產消費者模型

<span style="font-size:18px;"><span style="font-size:18px;">package com.ft.com.nextxteam.test;

import java.util.LinkedList;

/**

* 使用wait/notify處理消費者問題

* Created by drjr on 16-9-19.

*/

public class TestProductConm {

public static class Storage {

// 倉庫最大存儲量

private final int MAX_SIZE = 100;

// 倉庫存儲的載體

private LinkedList<Object> list = new LinkedList<Object>();

// 生產num個產品

public void produce(int num) {

// 同步代碼段

synchronized (list) {

// 如果倉庫剩余容量不足

while (list.size() + num > MAX_SIZE) {

System.out.println("要生產的產品數量:" + num + "/t庫存量:"

+ list.size() + "/t暫時不能執行生產任務!");

try {

// 由於條件不滿足,生產阻塞

list.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 生產條件滿足情況下,生產num個產品

for (int i = 1; i <= num; ++i) {

list.add(new Object());

}

System.out.println("已經生產產品數:" + num + "/t現倉儲量為:" + list.size());

list.notifyAll();

}

}

// 消費num個產品

public void consume(int num) {

// 同步代碼段

synchronized (list) {

// 如果倉庫存儲量不足

while (list.size() < num) {

System.out.println("要消費的產品數量:" + num + "/t庫存量:"

+ list.size() + "/t暫時不能執行生產任務!");

try {

// 由於條件不滿足,消費阻塞

list.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 消費條件滿足情況下,消費num個產品

for (int i = 1; i <= num; ++i) {

list.remove();

}

System.out.println("已經消費產品數:" + num + "/t現倉儲量為:" + list.size());

list.notifyAll();

}

}

// get/set方法

public LinkedList<Object> getList() {

return list;

}

public void setList(LinkedList<Object> list) {

this.list = list;

}

public int getMAX_SIZE() {

return MAX_SIZE;

}

}

public static class Producer extends Thread {

// 每次生產的產品數量

private int num;

// 所在放置的倉庫

private Storage storage;

// 構造函數,設置倉庫

public Producer(Storage storage) {

this.storage = storage;

}

// 線程run函數

public void run() {

produce(num);

}

// 調用倉庫Storage的生產函數

public void produce(int num) {

storage.produce(num);

}

// get/set方法

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public Storage getStorage() {

return storage;

}

public void setStorage(Storage storage) {

this.storage = storage;

}

}

public static class Consumer extends Thread {

// 每次消費的產品數量

private int num;

// 所在放置的倉庫

private Storage storage;

// 構造函數,設置倉庫

public Consumer(Storage storage) {

this.storage = storage;

}

// 線程run函數

public void run() {

consume(num);

}

// 調用倉庫Storage的生產函數

public void consume(int num) {

storage.consume(num);

}

// get/set方法

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public Storage getStorage() {

return storage;

}

public void setStorage(Storage storage) {

this.storage = storage;

}

}

public static void main(String[] args) {

// 倉庫對象

Storage storage = new Storage();

// 生產者對象

Producer p1 = new Producer(storage);

Producer p2 = new Producer(storage);

Producer p3 = new Producer(storage);

Producer p4 = new Producer(storage);

Producer p5 = new Producer(storage);

Producer p6 = new Producer(storage);

Producer p7 = new Producer(storage);

// 消費者對象

Consumer c1 = new Consumer(storage);

Consumer c2 = new Consumer(storage);

Consumer c3 = new Consumer(storage);

// 設置生產者產品生產數量

p1.setNum(10);

p2.setNum(10);

p3.setNum(10);

p4.setNum(10);

p5.setNum(10);

p6.setNum(10);

p7.setNum(80);

// 設置消費者產品消費數量

c1.setNum(50);

c2.setNum(20);

c3.setNum(30);

// 線程開始執行

c1.start();

c2.start();

c3.start();

p1.start();

p2.start();

p3.start();

p4.start();

p5.start();

p6.start();

p7.start();

}

}</span></span>

  • 上一篇:軟考考什麽內容
  • 下一篇:在國外,工程造價管理的全稱是什麽?(即怎麽翻譯他)
  • copyright 2024編程學習大全網