Java 并发性:等待公共代码块完成

Java 并发性:等待公共代码块完成,java,concurrency,producer-consumer,Java,Concurrency,Producer Consumer,我正在编写一个多线程服务器,需要处理客户机请求并在完成后将它们返回给客户机 我有一个并发客户机连接对象列表,它将有效负载传递到一个公共队列。通过队列后,服务器处理有效负载并生成响应 我遇到的问题是,我不知道如何通知客户机服务器已完成处理 这是处理客户端有效负载的线程,有效负载是以前由客户端线程加载的阻塞队列: Thread messageHandling = new Thread() { public void run(){ while(true){

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

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

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

这是处理客户端有效负载的线程,有效负载是以前由客户端线程加载的阻塞队列:

 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
}

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

我花了大量时间进行研究,研究了消费者/生产者问题、等待/通知机制等,但似乎没有什么与这个特定问题类似


任何帮助都将不胜感激。

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

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

在您的
//向客户端发送REPLY BACCK
中,只需发送响应即可。无需在
///睡眠中等待,直到服务器完成对负载的逻辑处理

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

在使用套接字的情况下,“允许您识别客户机的东西”将是套接字实例

其他方法将使用
SynchronousQueue

//向客户端发送回复BACCK
中,您将响应放入其中

///睡眠中,直到服务器完成对有效负载的逻辑操作为止
您接受响应(方法将阻塞,直到将响应放入缓冲区)


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

“但似乎没有什么类似于此特定问题。”据我所知,您在实例(服务器)上保留作业并收集结果,而许多客户端提取可用作业并需要报告结果,对吗?没错,然后,您的“dispatcher”对象中需要两个方法,即
take()
方法,您的代码已经有了,以及一个返回结果的方法,如
report(JobResult jr)
。客户得到了他们的工作,就像你已经得到的一样。完成后,他们会报告结果,“dispatcher”对象必须将结果与作业匹配,并对结果执行它应该执行的操作。谢谢,这是有意义的。所以在这种情况下,我不应该在客户端线程中有一个等待部分,套接字应该在服务器方法完成工作后写入并从服务器方法关闭?是的。第一种方法更好,因为它不会阻塞读取线程。