2010年6月17日木曜日

Java7 使ってみました。(TransferQueue)

今度リリースされる、Java7の新クラスの1つである「TransferQueue」を使ってみました。
説明によると、TransferQueueはQueueのクラスで、あるスレッドがこのQueueにオブジェクトを
追加すると、別のスレッドがQueue内の先程追加されたオブジェクトを削除しないと
オブジェクトを追加したスレッドに制御が戻らない。とのこと。
言葉で説明しても、うまく伝わらないので、早速使ってみます。

その前に、まずはJava7のダウンロードから。
ダウンロードはこちらから↓

早速、Eclipseの設定画面でJava7を指定してみたけど、コンパイラー準拠レベルには1.6までしか
現れない・・・。まだ、正式リリース版だからでは無いからでしょうか?
仕方ないので、基本設定は1.6のままで勧めます。

Javaプロジェクトを作成して、ビルドパスから
「JREシステム・ライブラリー」をjre7に変更してやります。
これで、先程ダウンロードしたJava7が使えるようになります。

下がサンプルソース。
  1. import java.util.concurrent.LinkedTransferQueue;  
  2. import java.util.concurrent.TransferQueue;  
  3.   
  4. public class TransferQueueSample {  
  5.   
  6.  private TransferQueue<string> queue;  
  7.   
  8.  public static void main(String[] args) {  
  9.   
  10.    final TransferQueueSample sample = new TransferQueueSample();  
  11.   
  12.    sample.go();  
  13.  }  
  14.   
  15.  protected void go() {  
  16.   
  17.   queue = new LinkedTransferQueue<string>();  
  18.   
  19.   final Thread threadA = new Thread(new ActionA());  
  20.   final Thread threadB = new Thread(new ActionB());  
  21.   
  22.   threadA.start();  
  23.   threadB.start();  
  24.  }  
  25.   
  26.  class ActionA implements Runnable {  
  27.   
  28.   public void run() {  
  29.    try {  
  30.     System.out.println("ActionA:testを追加します。");  
  31.     queue.transfer("test");  
  32.     System.out.println("ActionA:testを追加しました。");  
  33.    } catch (InterruptedException e) {  
  34.     e.printStackTrace();  
  35.    }  
  36.   }  
  37.  }  
  38.   
  39.  class ActionB implements Runnable {  
  40.   
  41.   public void run() {  
  42.    try {  
  43.     System.out.println("ActionB:5s間待機します。");  
  44.     int i = 0;  
  45.     while (i++ &lt; 5) {  
  46.      Thread.sleep(1000);  
  47.      System.out.println(i);  
  48.     }  
  49.     queue.remove();  
  50.    } catch (InterruptedException e) {  
  51.     e.printStackTrace();  
  52.    }  
  53.   }  
  54.  }  
  55.   
  56. }  
  57.   
  58. </string></string>  
簡単に説明すると、まずActionAは、TransferQueueに文字列"test"を 追加します。この際に使用するメソッドはtransfer(Object)。 このtransferメソッドが、queneにオブジェクトを追加し、そのオブジェクトが 削除されるまで、制御をActionAに返さないようにしています。 transferが実行された後は、メッセージを表示します。 次に、ActionBです。ActionBは5s停止後、quene内のオブジェクトを削除します。 実行してみるとわかると思いますが、ActionAがtransferメソッドを呼び出した後に、 ActionBのカウントダウンが表示された後に、ActionA側の"testを追加しました"との メッセージが表示されたと思います。 Java6まででは、このような動きを実現するには、while()でquenu内の監視をしなくては いけませんでしたが、transferメソッドを使用することで簡単に実現できるようになっています。

0 件のコメント:

コメントを投稿