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”对象必须将结果与作业匹配,并对结果执行它应该执行的操作。谢谢,这是有意义的。所以在这种情况下,我不应该在客户端线程中有一个等待部分,套接字应该在服务器方法完成工作后写入并从服务器方法关闭?是的。第一种方法更好,因为它不会阻塞读取线程。