天天看點

用JAVA 實作“生産者-消費者”問題

生産者和消費者問題是從作業系統中的許多實際同步問題中抽象出來的具有

代表性的問題。它反映了作業系統中典型的同步例子。

  生産者程序(程序由多個線程組成)生産資訊,例如它可以是計算程序。消費

者程序使用資訊,它可以是輸出列印程序。由于生産者和消費者彼此獨立,且運

行速度不确定,是以很可能出現生産者已産生了資訊而消費者卻沒有來得及接受

資訊這種情況。為此,需要引入由一個或者若幹個存儲單元組成的臨時存儲區,

以便存放生産者所産生的資訊,平滑程序間由于速度不确定所帶來的問題。這個

臨時存儲區叫做緩沖區,通常用一維數組來表示。

  由一個或若幹個存儲單元組成的緩沖區叫作“有窮緩沖區”。下面我們來分

析一下有窮緩沖的生産者和消費者的例子。

  假設有多個生産者和多個消費者,它們共享一個具有n個存儲單元的有窮緩沖

區Buffer(0……n-1),這是一個環形隊列。其隊尾指針Rear指向目前資訊應存放

的位置(Buffer[Rear]),隊首指針Front指向目前取出資訊的位置(Buffer[front

])。生産者程序總是把資訊存放在Buffer[Rear]中,消費者程序則總是從Buffer

[Rear]中取出資訊。如果想使生産者程序和消費者程序協調合作,則必須使它們

遵循如下規則:

  1) 隻要緩沖區有存儲單元,生産者都可往其中存放資訊;當緩沖區已滿時,

若任意生産者提出寫要求,則都必須等待;

  2) 隻要緩沖區中有消息可取,消費者都可從緩沖區中取出消息;當緩沖區為

空時,若任意消費者想取出資訊,則必須等待;

  3) 生産者們和消費者們不能同時讀、寫緩沖區。

  用JAVA 實作“生産者-消費者”問題的代碼如下:

public class ProducerConsumer {

 public static void main(String[] args) {

  SyncStack ss = new SyncStack();

  Producer p = new Producer(ss);

  Consumer c = new Consumer(ss);

  new Thread(p).start();

  new Thread(c).start();

 }

}

class WoTou {

 int id;

 WoTou(int id) {

  this.id = id;

 public String toString() {

  return "WoTou : " + id;

class SyncStack {

 int index = 0;

 WoTou[] arrWT = new WoTou[6];

 public synchronized void push(WoTou wt) {

  while(index == arrWT.length) {

   try {

    this.wait();

   } catch (InterruptedException e) {

    e.printStackTrace();

   }

  }

  this.notifyAll();  

  arrWT[index] = wt;

  index ++;

 public synchronized WoTou pop() {

  while(index == 0) {

  this.notifyAll();

  index--;

  return arrWT[index];

class Producer implements Runnable {

 SyncStack ss = null;

 Producer(SyncStack ss) {

  this.ss = ss;

 public void run() {

  for(int i=0; i<20; i++) {

   WoTou wt = new WoTou(i);

   ss.push(wt);

System.out.println("生産了:" + wt);

    Thread.sleep((int)(Math.random() * 200));

   }   

class Consumer implements Runnable {

 Consumer(SyncStack ss) {

   WoTou wt = ss.pop();

System.out.println("消費了: " + wt);

    Thread.sleep((int)(Math.random() * 1000));

生産者消費者問題是研究多線程程式時繞不開的問題,它的描述是有一塊生産者和消費者共享的有界緩沖區,生産者往緩沖區放入産品,消費者從緩沖區取走産品,這個過程可以無休止的執行,不能因緩沖區滿生産者放不進産品而終止,也不能因緩沖區空消費者無産品可取而終止。

       解決生産者消費者問題的方法有兩種,一種是采用某種機制保持生産者和消費者之間的同步,一種是在生産者和消費者之間建立一個管道。前一種有較高的效率并且可控制性較好,比較常用,後一種由于管道緩沖區不易控制及被傳輸資料對象不易封裝等原因,比較少用。

       同步問題的核心在于,CPU是按時間片輪詢的方式執行程式,我們無法知道某一個線程是否被執行、是否被搶占、是否結束等,是以生産者完全可能當緩沖區已滿的時候還在放入産品,消費者也完全可能當緩沖區為空時還在取出産品。

       現在同步問題的解決方法一般是采用信号或者加鎖機制,即生産者線程當緩沖區已滿時放棄自己的執行權,進入等待狀态,并通知消費者線程執行。消費者線程當緩沖區已空時放棄自己的執行權,進入等待狀态,并通知生産者線程執行。這樣一來就保持了線程的同步,并避免了線程間互相等待而進入死鎖狀态。

       JAVA語言提供了獨立于平台的線程機制,保持了”write once, run anywhere”的特色。同時也提供了對同步機制的良好支援。

       在JAVA中,一共有四種方法支援同步,其中三個是同步方法,一個是管道方法。

1.      方法wait()/notify()

2.       方法await()/signal()

3.       阻塞隊列方法BlockingQueue

4.       管道方法PipedInputStream/PipedOutputStream

下面我們看各個方法的實作:

1.       方法wait()/notify()

wait()和notify()是根類Object的兩個方法,也就意味着所有的JAVA類都會具有這個兩個方法,為什麼會被這樣設計呢?我們可以認為所有的對象預設都具有一個鎖,雖然我們看不到,也沒有辦法直接操作,但它是存在的。

wait()方法表示:當緩沖區已滿或空時,生産者或消費者線程停止自己的執行,放棄鎖,使自己處于等待狀态,讓另一個線程開始執行;

notify()方法表示:當生産者或消費者對緩沖區放入或取出一個産品時,向另一個線程發出可執行通知,同時放棄鎖,使自己處于等待狀态。

下面是一個例子代碼:

用JAVA 實作“生産者-消費者”問題

import java.util.LinkedList;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

public class Sycn1...{

用JAVA 實作“生産者-消費者”問題

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

用JAVA 實作“生産者-消費者”問題

    private int MAX = 10;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public Sycn1()...{

用JAVA 實作“生産者-消費者”問題

    }

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public void start()...{

用JAVA 實作“生産者-消費者”問題

            new Producer().start();

用JAVA 實作“生産者-消費者”問題

            new Consumer().start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public static void main(String[] args) throws Exception...{

用JAVA 實作“生産者-消費者”問題

        Sycn1 s1 = new Sycn1();

用JAVA 實作“生産者-消費者”問題

        s1.start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    class Producer extends Thread...{        

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        public void run()...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

            while(true)...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                synchronized(myList)...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    try...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                        while(myList.size() == MAX)...{

用JAVA 實作“生産者-消費者”問題

                            System.out.println("warning: it's full!");

用JAVA 實作“生産者-消費者”問題

                            myList.wait();

用JAVA 實作“生産者-消費者”問題

                        }

用JAVA 實作“生産者-消費者”問題

                        Object o = new Object();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                        if(myList.add(o))...{

用JAVA 實作“生産者-消費者”問題

                            System.out.println("Producer: " + o);

用JAVA 實作“生産者-消費者”問題

                            myList.notify();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    }catch(InterruptedException ie)...{

用JAVA 實作“生産者-消費者”問題

                        System.out.println("producer is interrupted!");

用JAVA 實作“生産者-消費者”問題

                    }

用JAVA 實作“生産者-消費者”問題

                }

用JAVA 實作“生産者-消費者”問題

            }

用JAVA 實作“生産者-消費者”問題

        }

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    class Consumer extends Thread...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                        while(myList.size() == 0)...{

用JAVA 實作“生産者-消費者”問題

                            System.out.println("warning: it's empty!");

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                        Object o = myList.removeLast();

用JAVA 實作“生産者-消費者”問題

                        System.out.println("Consumer: " + o);

用JAVA 實作“生産者-消費者”問題

                        myList.notify();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                        System.out.println("consumer is interrupted!");

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

在JDK5.0以後,JAVA提供了新的更加健壯的線程處理機制,包括了同步、鎖定、線程池等等,它們可以實作更小粒度上的控制。await()和signal()就是其中用來做同步的兩種方法,它們的功能基本上和wait()/notify()相同,完全可以取代它們,但是它們和新引入的鎖定機制Lock直接挂鈎,具有更大的靈活性。

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

import java.util.concurrent.locks.*;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

public class Sycn2...{

用JAVA 實作“生産者-消費者”問題

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

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    private final Lock lock = new ReentrantLock();

用JAVA 實作“生産者-消費者”問題

    private final Condition full = lock.newCondition();

用JAVA 實作“生産者-消費者”問題

    private final Condition empty = lock.newCondition();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public Sycn2()...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        Sycn2 s2 = new Sycn2();

用JAVA 實作“生産者-消費者”問題

        s2.start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                lock.lock();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                try...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    while(myList.size() == MAX)...{

用JAVA 實作“生産者-消費者”問題

                        System.out.println("warning: it's full!");

用JAVA 實作“生産者-消費者”問題

                        full.await();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    Object o = new Object();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    if(myList.add(o))...{

用JAVA 實作“生産者-消費者”問題

                        System.out.println("Producer: " + o);

用JAVA 實作“生産者-消費者”問題

                        empty.signal();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                }catch(InterruptedException ie)...{

用JAVA 實作“生産者-消費者”問題

                    System.out.println("producer is interrupted!");

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                }finally...{

用JAVA 實作“生産者-消費者”問題

                    lock.unlock();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    while(myList.size() == 0)...{

用JAVA 實作“生産者-消費者”問題

                        System.out.println("warning: it's empty!");

用JAVA 實作“生産者-消費者”問題

                        empty.await();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    Object o = myList.removeLast();

用JAVA 實作“生産者-消費者”問題

                    System.out.println("Consumer: " + o);

用JAVA 實作“生産者-消費者”問題

                    full.signal();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    System.out.println("consumer is interrupted!");

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

BlockingQueue也是JDK5.0的一部分,它是一個已經在内部實作了同步的隊列,實作方式采用的是我們的第2種await()/signal()方法。它可以在生成對象時指定容量大小。

它用于阻塞操作的是put()和take()方法。

put()方法類似于我們上面的生産者線程,容量最大時,自動阻塞。

take()方法類似于我們上面的消費者線程,容量為0時,自動阻塞。

用JAVA 實作“生産者-消費者”問題

import java.util.concurrent.*;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

public class Sycn3...{

用JAVA 實作“生産者-消費者”問題

    private LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public Sycn3()...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        Sycn3 s3 = new Sycn3();

用JAVA 實作“生産者-消費者”問題

        s3.start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                //synchronized(this){

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    if(queue.size() == MAX)

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    queue.put(o);

用JAVA 實作“生産者-消費者”問題

                    System.out.println("Producer: " + o);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    }catch(InterruptedException e)...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                //}

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    if(queue.size() == 0)

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    Object o = queue.take();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

你發現這個例子中的問題了嗎?

如果沒有,我建議你運作一下這段代碼,仔細觀察它的輸出,是不是有下面這個樣子的?為什麼會這樣呢?

warning: it's full!

Producer: java.lang.object@4526e2a

你可能會說這是因為put()和System.out.println()之間沒有同步造成的,我也這樣認為,我也這樣認為,但是你把run()中的synchronized前面的注釋去掉,重新編譯運作,有改觀嗎?沒有。為什麼?

這是因為,當緩沖區已滿,生産者在put()操作時,put()内部調用了await()方法,放棄了線程的執行,然後消費者線程執行,調用take()方法,take()内部調用了signal()方法,通知生産者線程可以執行,緻使在消費者的println()還沒運作的情況下生産者的println()先被執行,是以有了上面的輸出。run()中的synchronized其實并沒有起什麼作用。

對于BlockingQueue大家可以放心使用,這可不是它的問題,隻是在它和别的對象之間的同步有問題。

對于這種多重嵌套同步的問題,以後再談吧,歡迎大家讨論啊!

這個類位于java.io包中,是解決同步問題的最簡單的辦法,一個線程将資料寫入管道,另一個線程從管道讀取資料,這樣便構成了一種生産者/消費者的緩沖區程式設計模式。

用JAVA 實作“生産者-消費者”問題

import java.io.*;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

public class Sycn4...{

用JAVA 實作“生産者-消費者”問題

    private PipedOutputStream pos;

用JAVA 實作“生産者-消費者”問題

    private PipedInputStream pis;

用JAVA 實作“生産者-消費者”問題

    //private ObjectOutputStream oos;

用JAVA 實作“生産者-消費者”問題

    //private ObjectInputStream ois;

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    public Sycn4()...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        try...{

用JAVA 實作“生産者-消費者”問題

            pos = new PipedOutputStream();

用JAVA 實作“生産者-消費者”問題

            pis = new PipedInputStream(pos);

用JAVA 實作“生産者-消費者”問題

            //oos = new ObjectOutputStream(pos);

用JAVA 實作“生産者-消費者”問題

            //ois = new ObjectInputStream(pis);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        }catch(IOException e)...{

用JAVA 實作“生産者-消費者”問題

            System.out.println(e);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        new Producer().start();

用JAVA 實作“生産者-消費者”問題

        new Consumer().start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        Sycn4 s4 = new Sycn4();

用JAVA 實作“生産者-消費者”問題

        s4.start();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    class Producer extends Thread...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

        public void run() ...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

            try...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                while(true)...{

用JAVA 實作“生産者-消費者”問題

                    int b = (int) (Math.random() * 255);

用JAVA 實作“生産者-消費者”問題

                    System.out.println("Producer: a byte, the value is " + b);

用JAVA 實作“生産者-消費者”問題

                    pos.write(b);

用JAVA 實作“生産者-消費者”問題

                    pos.flush();

用JAVA 實作“生産者-消費者”問題

                    //Object o = new MyObject();

用JAVA 實作“生産者-消費者”問題

                    //oos.writeObject(o);

用JAVA 實作“生産者-消費者”問題

                    //oos.flush();

用JAVA 實作“生産者-消費者”問題

                    //System.out.println("Producer: " + o);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

            }catch(Exception e)...{

用JAVA 實作“生産者-消費者”問題

                //System.out.println(e);

用JAVA 實作“生産者-消費者”問題

                e.printStackTrace();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

            }finally...{

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    pos.close();

用JAVA 實作“生産者-消費者”問題

                    pis.close();

用JAVA 實作“生産者-消費者”問題

                    //oos.close();

用JAVA 實作“生産者-消費者”問題

                    //ois.close();

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                }catch(IOException e)...{

用JAVA 實作“生産者-消費者”問題

                    System.out.println(e);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

                    int b = pis.read();

用JAVA 實作“生産者-消費者”問題

                    System.out.println("Consumer: a byte, the value is " + String.valueOf(b));

用JAVA 實作“生産者-消費者”問題

                    //Object o = ois.readObject();

用JAVA 實作“生産者-消費者”問題

                    //if(o != null)

用JAVA 實作“生産者-消費者”問題

                        //System.out.println("Consumer: " + o);

用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題
用JAVA 實作“生産者-消費者”問題

    //class MyObject implements Serializable {

用JAVA 實作“生産者-消費者”問題

    //}

用JAVA 實作“生産者-消費者”問題