熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java編程技巧(信號量,管道)

2013-11-15 11:35:33  來源: JSP教程 

  一信號量
  
  在進行多線程編程時經常要使用同步互斥機構但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原語,用於喚醒線程恢復運行。tW.winGwit.COm由於這兩個方法定義為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;
  
  }

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19257.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.