我想在我的程序做其他事情的时候收听服务器,当从服务器收到一条消息时,我想解释它。
我知道线程,但不确定它是如何工作的。如果我有一个线程监听服务器,我如何将该数据传递给主线程进行解释?主线程向服务器发送数据的最佳方式是什么?同步修饰符有什么用?
我想在我的程序做其他事情的时候收听服务器,当从服务器收到一条消息时,我想解释它。
我知道线程,但不确定它是如何工作的。如果我有一个线程监听服务器,我如何将该数据传递给主线程进行解释?主线程向服务器发送数据的最佳方式是什么?同步修饰符有什么用?
如果我有一个线程监听服务器,我如何将该数据传递给主线程进行解释?主线程向服务器发送数据的最佳方式是什么?
我会用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
实现你的逻辑。当然,您也应该处理异常,处理退出案例,更改MethodCall
为具有比methodName
andargs
和Object
return 更具体的东西等。
阅读一些教程以了解 Java 线程。
http://www.journaldev.com/1079/java-thread-tutorial
您的问题似乎类似于生产者-消费者模型,您可以使用 BlockingQueue 轻松完成此任务。