并发:等到公共代码块完成

时间:2016-10-28 17:48:31

标签: java concurrency producer-consumer

我正在编写一个多线程服务器,需要处理客户端请求并在完成后将它们返回给客户端。

我有一个并发客户端连接对象列表,它将有效负载传递给公共队列。在完成队列之后,服务器处理有效负载并生成响应。

我遇到的问题是我不知道如何通知客户端服务器已经完成处理。

这是处理客户端有效负载的线程,payLoad是一个BlockingQueue,之前由客户端线程加载:

 Thread messageHandling = new Thread() {
        public void run(){
            while(true){
                try{
                    Object payLoad= payLoads.take();
                    // Do some handling                        
                   // SEND REPLY BACCK TO THE CLIENT
                }
                catch(InterruptedException e){ }
            }
        }
    };

与此同时,在客户端,发生了以下情况:

{
   ...
payloads.add(payLoad)
/// Sleep until the server is done doing its logic with the payload

}

评论位是我遇到麻烦的地方。我不知道如何实现一种机制,客户端线程将等待处理请求,一旦它,我不知道如何将回复发送回客户端。

我花了很多时间研究,查看消费者/生产者问题,等待/通知机制等,但似乎没有任何类似于这个特定问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要在payloads

中的有效负载旁边存储客户端连接信息

创建包含两个字段的类。其中一个将是您的有效负载,另一个是允许您识别您的客户端。

// SEND REPLY BACCK TO THE CLIENT中发送回复。无需在/// Sleep until the server is done doing its logic with the payload

等待

如果不知道您与客户沟通的方式,我无法给您更好的答案。

如果您使用套接字“允许您识别客户端的东西”将是套接字实例。

其他方法将使用SynchronousQueue

// SEND REPLY BACCK TO THE CLIENT中,您将回复录入其中。

/// Sleep until the server is done doing its logic with the payload中你接受响应(方法将阻塞,直到响应被放入缓冲区)。

使用与前一种方法相同的有效载荷缓冲区。