プログラムが他のことをしている間、サーバーをリッスンしたいのですが、サーバーからメッセージを受信したときに、それを解釈したいと思います。
私はスレッド化について知っていますが、それがどのように機能するかについて完全にはわかりません。サーバーをリッスンしているスレッドがある場合、解釈のためにそのデータをメインスレッドに渡すにはどうすればよいですか?メインスレッドがサーバーにデータを送信するための最良の方法は何ですか?同期修飾子の用途は何ですか?
プログラムが他のことをしている間、サーバーをリッスンしたいのですが、サーバーからメッセージを受信したときに、それを解釈したいと思います。
私はスレッド化について知っていますが、それがどのように機能するかについて完全にはわかりません。サーバーをリッスンしているスレッドがある場合、解釈のためにそのデータをメインスレッドに渡すにはどうすればよいですか?メインスレッドがサーバーにデータを送信するための最良の方法は何ですか?同期修飾子の用途は何ですか?
サーバーをリッスンしているスレッドがある場合、解釈のためにそのデータをメインスレッドに渡すにはどうすればよいですか?メインスレッドがサーバーにデータを送信するための最良の方法は何ですか?
これにはを使用しBlockingQueue
ます。BlockingQueue
のような単一を定義しますLinkedBlockingQueue
。次に、リスナークラスが呼び出しqueue.take()
、サーバーが呼び出すのを待ちますqueue.put()
。独自のコードではなく、すべての同期、待機、通知などをJavaクラスに任せます。
同期修飾子の用途は何ですか?
私はこれについてもっと理解するためにいくつかの読書をします。これは、短めのSO応答で答えられるようなものではありません。Java同時実行チュートリアルは、開始するのに適した場所です。
メインスレッドと処理スレッド間の同期通信が必要な場合は、SynchronousQueueを使用できます。
アイデアは、メインスレッドがを呼び出すことによって処理スレッドにデータを渡し、put()
処理スレッドがを呼び出すというものtake()
です。どちらもブロッキング操作です。
結果を送り返したい場合は、メインスレッドが結果の準備ができたことを認識しなければならないため、状況が少し複雑になる可能性があることに注意してください。CountDownLatchは、このための優れたプリミティブです。あなたはこのようなことをすることができます。
まず、データを渡すためのデータ構造を定義しましょう。
public class MethodCall {
public final String methodName;
public final Object[] args;
public final CountDownLatch resultReady;
public Object result;
public MethodCall(String methodName, Object[] args) {
this.methodName = methodName;
this.args = args;
this.resultReady = new CountDownLatch(1);
}
public void setResult(Object result) {
this.result = result;
resultReady.countDown();
}
public Object getResult() throws InterruptedException {
resultReady.await();
return result;
}
}
両方のスレッドから見えるデータを渡すキューを定義します。
public SynchronousQueue<MethodCall> methodCalls = new SynchronousQueue<MethodCall>();
メインスレッドから処理スレッドに呼び出しを行い、結果を待つには:
MethodCall call = new MethodCall(methodName, args);
methodCalls.put(call);
Object result = call.getResult();
処理スレッド、たとえばrun()
メソッドでは、次のことができます。
for (;;) {
MethodCall call = methodCalls.take();
Object res = processStuff(call.methodName, call.args);
call.setResult(res);
}
processStuff
ロジックを実装する場所。もちろん、例外にも対処し、終了ケースに対処し、andやreturnMethodCall
よりも具体的なものに変更する必要があります。methodName
args
Object
Javaスレッドを理解するためのチュートリアルをいくつか実行してください。
http://www.journaldev.com/1079/java-thread-tutorial
あなたの問題は生産者/消費者モデルのようです。BlockingQueueを使用してこのタスクを簡単に実行できます。