Java 7新特性(四)同時6 TransferQueueオブジェクト
2081 ワード
本文は主に『Javaプログラマー修練の道』に基づいて整理したコードノートの断片
TransferQueueオブジェクト受信スレッドが待機している場合、transfer()はすぐに作業項目を送信します.そうしないと、作業項目を取り出すまでブロックされます[効率的]
すなわち、処理中の作業項目のスレッドは、現在の作業が引き渡される前(取り出される前)に、他の作業項目の処理を開始しない.
LinkedBlockingQueueを使用してサイズを設定する必要があります.そうしないと、接続スレッドプールのプラグが速すぎると、メモリがオーバーフローします.
TransferQueueオブジェクト受信スレッドが待機している場合、transfer()はすぐに作業項目を送信します.そうしないと、作業項目を取り出すまでブロックされます[効率的]
すなわち、処理中の作業項目のスレッドは、現在の作業が引き渡される前(取り出される前)に、他の作業項目の処理を開始しない.
public abstract class MicroBlogThread extends Thread {
protected final TransferQueue<Update> updates;
protected String text = "";
protected final int pauseTime;
private boolean shutdown = false;
public MicroBlogThread(TransferQueue<Update> lbq_, int pause_) {
updates = lbq_;
pauseTime = pause_;
}
public synchronized void shutdown() {
shutdown = true;
}
@Override
public void run() {
while (!shutdown) {
doAction();
try {
Thread.sleep(pauseTime);
} catch (InterruptedException e) {
shutdown = true;
}
}
}
public abstract void doAction();
}
public class MicroBlogThreadMain {
public static void main(String[] a) {
final Update.Builder ub = new Update.Builder();
final TransferQueue<Update> lbq = new LinkedTransferQueue<>();
// ,transfer() , [ ]
MicroBlogThread t1 = new MicroBlogThread(lbq, 10) {
public void doAction() {
text = text + "X";
Update u = ub.author(new Author("Tallulah")).updateText(text).build();
boolean handed = false;
try {
handed = updates.offer(u, 100, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
}
if (!handed)
System.out
.println("Unable to handoff Update to Queue due to timeout");
}
};
MicroBlogThread t2 = new MicroBlogThread(lbq, 1000) {
public void doAction() {
@SuppressWarnings("unused")
Update u = null;
try {
u = updates.take();
} catch (InterruptedException e) {
return;
}
}
};
t1.start();
t2.start();
}
}
LinkedBlockingQueueを使用してサイズを設定する必要があります.そうしないと、接続スレッドプールのプラグが速すぎると、メモリがオーバーフローします.