説明によると、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 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();
}
}
}
}
簡単に説明すると、まずActionAは、TransferQueueに文字列"test"を 追加します。この際に使用するメソッドはtransfer(Object)。 このtransferメソッドが、queneにオブジェクトを追加し、そのオブジェクトが 削除されるまで、制御をActionAに返さないようにしています。 transferが実行された後は、メッセージを表示します。 次に、ActionBです。ActionBは5s停止後、quene内のオブジェクトを削除します。 実行してみるとわかると思いますが、ActionAがtransferメソッドを呼び出した後に、 ActionBのカウントダウンが表示された後に、ActionA側の"testを追加しました"との メッセージが表示されたと思います。 Java6まででは、このような動きを実現するには、while()でquenu内の監視をしなくては いけませんでしたが、transferメソッドを使用することで簡単に実現できるようになっています。
0 件のコメント:
コメントを投稿