説明によると、TransferQueueはQueueのクラスで、あるスレッドがこのQueueにオブジェクトを
追加すると、別のスレッドがQueue内の先程追加されたオブジェクトを削除しないと
オブジェクトを追加したスレッドに制御が戻らない。とのこと。
言葉で説明しても、うまく伝わらないので、早速使ってみます。
追加すると、別のスレッドがQueue内の先程追加されたオブジェクトを削除しないと
オブジェクトを追加したスレッドに制御が戻らない。とのこと。
言葉で説明しても、うまく伝わらないので、早速使ってみます。
その前に、まずはJava7のダウンロードから。
ダウンロードはこちらから↓
早速、Eclipseの設定画面でJava7を指定してみたけど、コンパイラー準拠レベルには1.6までしか
現れない・・・。まだ、正式リリース版だからでは無いからでしょうか?
仕方ないので、基本設定は1.6のままで勧めます。
Javaプロジェクトを作成して、ビルドパスから
「JREシステム・ライブラリー」をjre7に変更してやります。
これで、先程ダウンロードしたJava7が使えるようになります。
下がサンプルソース。
「JREシステム・ライブラリー」をjre7に変更してやります。
これで、先程ダウンロードしたJava7が使えるようになります。
下がサンプルソース。
import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TransferQueue; public class TransferQueueSample { private TransferQueue簡単に説明すると、まずActionAは、TransferQueueに文字列"test"を 追加します。この際に使用するメソッドはtransfer(Object)。 このtransferメソッドが、queneにオブジェクトを追加し、そのオブジェクトが 削除されるまで、制御をActionAに返さないようにしています。 transferが実行された後は、メッセージを表示します。 次に、ActionBです。ActionBは5s停止後、quene内のオブジェクトを削除します。 実行してみるとわかると思いますが、ActionAがtransferメソッドを呼び出した後に、 ActionBのカウントダウンが表示された後に、ActionA側の"testを追加しました"との メッセージが表示されたと思います。 Java6まででは、このような動きを実現するには、while()でquenu内の監視をしなくては いけませんでしたが、transferメソッドを使用することで簡単に実現できるようになっています。queue; public static void main(String[] args) { final TransferQueueSample sample = new TransferQueueSample(); sample.go(); } protected void go() { queue = new LinkedTransferQueue (); final Thread threadA = new Thread(new ActionA()); final Thread threadB = new Thread(new ActionB()); threadA.start(); threadB.start(); } class ActionA implements Runnable { public void run() { try { System.out.println("ActionA:testを追加します。"); queue.transfer("test"); System.out.println("ActionA:testを追加しました。"); } catch (InterruptedException e) { e.printStackTrace(); } } } class ActionB implements Runnable { public void run() { try { System.out.println("ActionB:5s間待機します。"); int i = 0; while (i++ < 5) { Thread.sleep(1000); System.out.println(i); } queue.remove(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
0 件のコメント:
コメントを投稿