Java程序間通訊
程序間通訊的方式有:
(1)管道(Pipe):管道可用於具有親緣關係程序間的通訊,允許一個程序和另一個與它有共同祖先的程序之間進行通訊。
(2)命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關 系 程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfifo或系統呼叫mkfifo來建立。
(3)訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送 訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式)。
(4)訊息(Message)佇列:訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺
(5)共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。
(6)記憶體對映(mapped memory):記憶體對映允許任何多個程序間通訊,每一個使用該機制的程序通過把一個共享的檔案對映到自己的程序地址空間來實現它。
(7)訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。
(8)套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。
Java中常用的有:
(1)共享變數
(2)wait和notify機制
(3)lock和condition機制
(4)訊息佇列
(5)管道
可以通過以上的方法是實現生產者消費問題 哲學家就餐問題等
以下為使用管道解決生產者消費者問題
ublic static class PipeConnection{
public static void main(String[] args) {
//建立輸入和輸出管道
PipeOutputStream pos = new PipeOutputStream();
PipeInputStream pis = new PipeInputStream();
try{
//將兩個管道相連
pos.connect(pis);
}
catch(IOException e){
e.printStackTrace();
}
//建立生產者和消費者
Producer p = new Producer();
Consumer c = new Consumer();
p.start();
c.start();
}
}
class Producer extend Thread{
private PipeOutputStream pos;
public Producer(PipeOutputStream pos){
this.pos = pos;
}
public void run(){
int i =0;
try{
while(true){
this.sleep(30000);
pos.write(i);
i++;
}
}catch(Exception e){
e.printStackTrace();
}
}
}
class Consumer extend Thread{
private PipeInputStream pis;
public Consumer(PipeInputStream pis){
this.pis = pis ;
}
public void run(){
int i = 0;
while(true){
System.out.println(pis.read());
}
}catch(IOException e){
e.printStackTrace();
}
}