Java - 客户端的两个线程可以使用来自服务器的相同输入流吗?

时间:2016-03-23 20:43:13

标签: java multithreading sockets inputstream

我正在开发一个Java客户端/服务器应用程序,它有一套非常具体的规则来确定我如何开发它。服务器创建一个ClientHandler实例,该实例具有到客户端套接字的输入和输出流,它们之间的任何输入和输出都由客户端GUI中的事件触发。

我现在添加了功能服务器端,它将向所有连接的客户端发送定期更新(通过将PrintWriter中的每个创建的ClientHandlers对象存储在ArrayList<PrintWriter>中来完成。我需要一个等效的机制客户端来处理这些消息,并且已经告知这需要在第二个客户端线程中发生,其run()方法使用do...while(true)循环,直到客户端断开连接。

到目前为止,这对我来说都是有意义的,我正在努力的是这两个线程必须共享一个输入流,并且基本上“忽略”任何不属于它们处理类型的消息。在我看来,它看起来应该是这样的:

假设来自服务器的每封邮件都会向所有邮件发送booleantrue,并在发送给某个客户端的邮件中发送值false之一...

Existing Client Thread
//method called from actionPerformed(ActionEvent e)
//handles server response to bid request
public void receiveResponse()
{
    //thread should only process to-specific-client messages
    if (networkInput.nextBoolean() == false)
    {
        //process server response...
    }
}


Second Client-side Thread
//should handle all messages set to all clients
run()
{
    do {
        if (networkInput.nextBoolean() == true)
        {
            //process broadcasted message...
        } while (true);
}

由于他们需要使用相同的输入流,我显然会添加一些synchronizedwait/notify来电,但一般情况下,我可能会在这里做些什么呢?或者尝试从同一输入流读入的两个线程是否会相互干扰太多?

请让我知道你的想法!

谢谢, 标记

1 个答案:

答案 0 :(得分:2)

你可以做到这一点,虽然测试和做对是很复杂的。多少&#34;太多&#34;取决于你。一个更简单的解决方案是让读者线程将消息传递给两个工作线程。

ExecutorService thread1 = Executors.newSingleThreadedExecutors();
ExecutorService thread2 = Executors.newSingleThreadedExecutors();
while(running) {
    Message message = input.readMessage();
    if (message.isTypeOne())
        thread1.submit(() -> process(message));
    else if (message.isTypeTwo())
        thread2.submit(() -> process(message));
    else
        // do something else.
}
thread1.shutdown();
thread2.shutdown();