与等待队列的多线程java同步

时间:2011-02-02 09:25:28

标签: java concurrency

我有一个关于java多线程的问题让我们看一下场景: 1线程服务器(本地,共享内存,它只是一个模拟)

class server extends Thead
syncronized public operation1
synchronized public operation2

....... public operationX

用run方法决定哪个op1,op2..opX“启用”

3线程客户端 - class client extend Thread

客户端调用直接op1,op2..opX到同一服务器线程(offcourse)创建并通过main ...传递op1,opX是exectud IN客户端服务器,它不是执行它的服务器线程..

所以运行方法中的所有服务器决定启用或禁用op1,op2..opX。 run方法中的客户端只需调用serverreference.op1()..... serverref.opX()

好的..现在假设所有3个客户端都调用op1而不是服务器启用,它们必须wait()然后其他人必须通知()......但是我需要处理这些通知FIFO。并且通知不要在fifo中运行等待它只是选择了一个暂停的线程..

我可以使用哪种实用程序来处理这种情况?

建议。

3 个答案:

答案 0 :(得分:2)

您可能希望使用阻止队列。在您的情况下可能是同步队列。

扩展模型以定义操作对象(请求)。然后线程将尝试将其请求添加到队列中。同时,服务器线程(如果我理解正确的话)将尝试从队列中检索请求并处理它们。

同步队列只是一个大小限制为0的阻塞队列。这意味着,每次线程尝试添加到队列时,它将阻塞,直到另一个线程尝试从该队列中获取一个项目。如果任何其他线程相同,它们也会阻塞(有公平性设置选项)。

如果没有提交操作,则服务器线程将阻塞,直到有一个可用。

注意,这会导致在服务器线程(main?)中执行操作。如果这不是您想要的,您可以另外将它们交给Executor以在一个或多个线程上运行。这可能听起来像很多开销,但根本不是。

的JavaDoc:

答案 1 :(得分:1)

答案 2 :(得分:0)

对于每次一个线程访问其中一个同步方法时阻塞的服务器对象,最好使用BlockingQueue