【问题标题】:Concurrency: Wait until common block of code is done并发:等到公共代码块完成
【发布时间】:2016-10-28 17:48:31
【问题描述】:

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

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

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

这是处理客户端负载的线程,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

}

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

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

任何帮助将不胜感激。

【问题讨论】:

  • “但似乎没有什么与这个特定问题相似。” 据我了解,您在实例(服务器)上保留了作业并收集结果,而许多客户拉出可用的工作并需要报告结果,对吗?
  • 没错
  • 好的,那么您的“调度程序”对象中需要 2 个方法,take() 方法,您的代码已经有一个方法来返回结果,例如 report(JobResult jr)。客户得到他们的工作,就像你已经拥有的一样。当他们完成时,他们报告他们的结果,并且“调度程序”对象必须将结果与作业匹配并执行它应该对结果执行的任何操作。

标签: java concurrency producer-consumer


【解决方案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 中,您获取响应(方法将阻塞,直到响应被放入缓冲区)。

通过与之前方法相同的有效负载传递缓冲区。

【讨论】:

  • 谢谢,这确实有道理。所以在这种情况下,我不应该在客户端线程中有等待部分,一旦它的工作完成,应该将套接字写入服务器方法并从它关闭?
  • 是的。第一种方法更好,因为它不会阻塞读取线程。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多