[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Java > 正文
Java編程技巧(信號量,管道)
本文出自:http://noc.cstnet.net.cn/ 瞿宏陽 (2001-06-08 15:00:00)

一、信號量 

在進行多線程編程時,經常要使用同步互斥機構,但java本身沒有提供的同步互斥機構,僅提供了兩個與同步互斥有關的方法:wait()和notify(),可以用來設計信號量類:mySemaphore,它是按照Dijkstra提出的計數信號量的思想設計的。 

mySemaphore有兩個最重要的成員方法:P()和V()。這兩個方法實際就實現了信號量的P操作和V操作。具體描述如下: 

public synchronized void P(){ 

semaphore--; 

if(semaphore<0){ 

try{ 

wait(); 

}catch(InterruptedException ie){} 





public synchronized void V(){ 

semaphore++; 

if(semaphore<=0) 

notify(); 



其中,semaphore變量記錄了信號量的狀態,wait()方法相當block原語,用阻塞線程的執行,notify()方法相當wakeup原語,用喚醒線程恢復運行。由這兩個方法定義為synchronized,這樣java虛擬機可保証這兩個方法的原子執行,從而實現了P、V操作。 

二、管道 

並發程序的多個線程之間的通訊通常是使用管道進行,jdk提供了兩個管道類:PipedInpuStream和PipedOutputStream,前者用輸入,者用輸出。這兩種管道應該是能夠多次連接和關閉,在實現過程中,卻發現它們在關閉,不能重新建立連接。經過仔細調試,發現jdk的源代碼在處理關閉時釋放資源存在著缺陷,因此需要編寫自己的管道類:MyPipedInputStream和MyPipedOutputStream。這兩個類直接從InputStream和OutputStream繼承而來,其成員方法與實現基本與PipedInputStream和PipedOutputStream一致,只是在處理關閉時,將類中的成員變量的值恢復成未連接時的初始值。另外,原有的管道了提供的管道容量只有1024個字節,在傳輸數據量較大時,可能會發生溢出,而在自己的管道類中可以任意設置管道容量,例如可以根據需要把管道容量設為64KB。以下僅給出了相應的關閉例程: 

1.MyPipedInputStream 

public void close() throws IOException { 

in = -1; 

out = 0; 

closedByReader = true; 

connected = false; 

closed = true; 

buffer = new byte[PIPE_SIZE]; 



2.MyPipedOutputStream 

public void close() throws IOException { 

if (sink != null) { 

sink.receivedLast(); 

sink.closed = true; 



sink = null; 

connected = false; 


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★