在线程之间传递信息的最佳方法是什么?

Bak*_*ies 26 java sockets multithreading

我希望在我的程序正在执行其他操作时收听服务器,当我从服务器收到要解释的消息时.

我知道线程但不完全确定它是如何工作的.如果我有一个线程监听服务器,我如何将该数据传递给主线程进行解释?主线程将数据发送到服务器的最佳方法是什么?synchronized修饰符有什么用?

Gra*_*ray 33

如果我有一个线程监听服务器,我如何将该数据传递给主线程进行解释?主线程将数据发送到服务器的最佳方法是什么?

我会用BlockingQueue这个.你定义了一个BlockingQueueLinkedBlockingQueue.然后queue.take(),您的侦听器类会调用等待服务器调用的内容queue.put().它将所有同步,等待,通知等留给Java类而不是您自己的代码.

synchronized修饰符有什么用?

我会做一些阅读以了解更多相关信息.这不是那种可以在简短的SO响应中回答的问题.在Java并发教程是一个良好的开端.


Flo*_*ume 8

如果要在主线程和处理线程之间进行同步通信,可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

定义队列以传递数据,两个线程都可以看到:

public SynchronousQueue<MethodCall> methodCalls = new SynchronousQueue<MethodCall>();
Run Code Online (Sandbox Code Playgroud)

从主线程到处理线程进行调用并等待结果:

MethodCall call = new MethodCall(methodName, args);
methodCalls.put(call);
Object result = call.getResult();
Run Code Online (Sandbox Code Playgroud)

在处理线程中,例如在run()方法中,您可以执行以下操作:

for (;;) {
    MethodCall call = methodCalls.take();
    Object res = processStuff(call.methodName, call.args);
    call.setResult(res);
}
Run Code Online (Sandbox Code Playgroud)

在哪里processStuff实现你的逻辑.当然,你应该处理异常,以及,处理退出的情况下,改变MethodCall为具有比更具体的东西methodNameargsObject回报等.


Pan*_*kaj 6

阅读一些教程以了解Java Threads.

http://www.journaldev.com/1079/java-thread-tutorial

您的问题似乎与生产者 - 消费者模型类似,您可以使用BlockingQueue轻松实现此任务.

Java阻塞队列