Java線程(十二):Exchanger-兄弟線程的信息交換 – JAVA編程語言程序開發技術文章

 如果兩個線程在運行過程中需要交換彼此的信息,比如一個數據或者使用的空間,就需要用到Exchanger這個類,Exchanger為線程交換信息提供瞭非常方便的途徑,它可以作為兩個線程交換對象的同步點,隻有當每個線程都在進入 exchange ()方法並給出對象時,才能接受其他線程返回時給出的對象。
      
       Exchanger的構造方法如下:
[java] 
Exchanger();  //創建一個新的 Exchanger。 

       Exchanger用到的主要方法有:
[java]
exchange(V x);  //等待另一個線程到達此交換點(除非它被中斷),然後將給定的對象傳送給該線程,並接收該線程的對象。 
exchange(V x, long timeout, TimeUnit unit);   // 等待另一個線程到達此交換點(除非它被中斷,或者超出瞭指定的等待時間),然後將給定的對象傳送給該線程,同時接收該線程的對象。 
     
     下面通過例子來加以說明:

[java] 
public class ExchangerTest { 
    public static void main(String[] args) { 
        ExecutorService service = Executors.newCachedThreadPool(); 
        final Exchanger exchanger = new Exchanger(); 
        service.execute(new Runnable(){ 
            public void run() { 
                try {                
                    String data1 = "zxx"; 
                    System.out.println("線程" + Thread.currentThread().getName() +  
                    "正在把數據" + data1 +"換出去"); 
                    Thread.sleep((long)(Math.random()*10000)); 
                    String data2 = (String)exchanger.exchange(data1); 
                    System.out.println("線程" + Thread.currentThread().getName() +  
                    "換回的數據為" + data2); 
                }catch(Exception e){     
                } 
            }    
        }); 
        service.execute(new Runnable(){ 
            public void run() { 
                try {                
                    String data1 = "lhm"; 
                    System.out.println("線程" + Thread.currentThread().getName() +  
                    "正在把數據" + data1 +"換出去"); 
                    Thread.sleep((long)(Math.random()*10000));                   
                    String data2 = (String)exchanger.exchange(data1); 
                    System.out.println("線程" + Thread.currentThread().getName() +  
                    "換回的數據為" + data2); 
                }catch(Exception e){     
                }                
            }    
        });      
    } 

        上例main()方法中創建瞭2個線程,兩個線程都有各自String類型的data,並且各自的sleep時間都不一樣。類中定義瞭一個Exchanger對象,作為兩個線程交換數據的通道,當其中一個線程運行exchanger.exchange();方法時,由於沒有另外一個線程還沒有開始執行這個交換方法,所以就需要等到另外一個線程也提出交換時,兩個線程才可以完成信息的交換。其運行結果如下:
[java] 
線程pool-1-thread-1正在把數據zxx換出去 
線程pool-1-thread-2正在把數據lhm換出去 
線程pool-1-thread-2換回的數據為zxx 
線程pool-1-thread-1換回的數據為lhm 

發佈留言