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