全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3396
推到 Plurk!
推到 Facebook!

Thread同步

答題得分者是:neoart
Randgris
一般會員


發表:20
回覆:30
積分:10
註冊:2007-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-06 00:36:15 IP:140.126.xxx.xxx 未訂閱
既然有wait()和notify()了 為啥還需要synchronized呢?

它們還一起混用 真是搞迷糊了...
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-06 08:40:07 IP:220.132.xxx.xxx 訂閱
請你先看API(英文不好,吃這行飯會很辛苦)
請參考大作:http://www.oreilly.com.tw/product_java.php?id=a159_toc
http://programming.im.ncnu.edu.tw/J_Chapter9.htm
(先問Google,再來問我,我是黑手出身,只對實務上的東東有點小經驗罷了)
編輯記錄
neoart 重新編輯於 2007-05-06 08:43:53, 註解 無‧
Randgris
一般會員


發表:20
回覆:30
積分:10
註冊:2007-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-06 11:22:09 IP:140.126.xxx.xxx 未訂閱
什麼是黑手呀xd? 別禁我~_~
===================引 用 neoart 文 章===================
請你先看API(英文不好,吃這行飯會很辛苦)
請參考大作:http://www.oreilly.com.tw/product_java.php?id=a159_toc
http://programming.im.ncnu.edu.tw/J_Chapter9.htm
(先問Google,再來問我,我是黑手出身,只對實務上的東東有點小經驗罷了)
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-06 14:54:05 IP:220.132.xxx.xxx 訂閱
所謂黑手指的是最基層的實作人員
最初是由車廠修車滿手沾滿油污的型象而來,
到最後泛指各行各業中最基層實作的操作人員
Randgris
一般會員


發表:20
回覆:30
積分:10
註冊:2007-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-06 17:07:32 IP:140.126.xxx.xxx 未訂閱
public synchronized void Sell(String A , int B)
{
Se = B ; // 取得訂單數量
while(Count < Se)
{
try{ this.wait( ) ; } // 讓執行緒進入待命狀態
catch(Exception e){ }
}

this.notifyAll( ) ; // 讓待命狀態中的所有執行緒都予以執行
Count = Count - Se ; // 計算銷貨之後的剩餘庫存
System.out.println( A " 銷貨 " B " , 目前尚餘貨品 " Count) ; // 顯示銷貨明細與庫存資訊
} // 結束方法
} //

當某一thread wait住時,它收到notify之後,是從新進入進爭進入public synchronized void Sell(String A , int B)裡

還是從wait下一行開始繼續執行呢?
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-06 19:03:35 IP:220.132.xxx.xxx 訂閱
查了資料,是wait的下一行
你測試的結果又是如何呢?
Randgris
一般會員


發表:20
回覆:30
積分:10
註冊:2007-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-08 21:28:39 IP:122.124.xxx.xxx 未訂閱
看起來應該也是= = 不然此範例應該就不需要迴圈才是 只是感覺lock權讓出去 又要搶回來 應該要從開頭才對...
===================引 用 neoart 文 章===================
查了資料,是wait的下一行
你測試的結果又是如何呢?
neoart
版主


發表:22
回覆:582
積分:425
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-09 00:20:40 IP:220.132.xxx.xxx 訂閱
你可能有點誤解了
我們來做個比喻吧
A跟B都是營業員,賣wii的
當他們要賣wii時(注意,這個函數是synchonized--單一櫃台),庫存不足時,跟好等到在那裡,
但是還是要有廠商去增加庫存,這時可以用notify的方式,告知營業員可以"繼續"進行交易.

類似的實作如下:
URL來源:http://www.roseindia.net/javatutorials/blocking_queue.shtml
//: BlockingQueue.java
import java.util.*;
public class BlockingQueue {
  /**
    It makes logical sense to use a linked list for a FIFO queue,
    although an ArrayList is usually more efficient for a short
    queue (on most VMs).
   */
  private final LinkedList queue = new LinkedList();
  /**
    This method pushes an object onto the end of the queue, and
    then notifies one of the waiting threads.
   */
  public void push(Object o) {
    synchronized(queue) {
      queue.add(o);
      queue.notify();
    }
  }
  /**
    The pop operation blocks until either an object is returned
    or the thread is interrupted, in which case it throws an
    InterruptedException.
   */
  public Object pop() throws InterruptedException {
    synchronized(queue) {
      while (queue.isEmpty()) {  
        queue.wait(); 
      }
      return queue.removeFirst();
    }
  }
  /** Return the number of elements currently in the queue. */
  public int size() {
    return queue.size();
  }
}
堆疊要pop出東西如果沒有元素可以pop時,就要停下來(或是丟出例外),直到有元素被增加進去,才可以進行pop的動作
系統時間:2024-05-05 18:16:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!