我有一个关于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中运行等待它只是选择了一个暂停的线程..
我可以使用哪种实用程序来处理这种情况?
建议。
答案 0 :(得分:2)
您可能希望使用阻止队列。在您的情况下可能是同步队列。
扩展模型以定义操作对象(请求)。然后线程将尝试将其请求添加到队列中。同时,服务器线程(如果我理解正确的话)将尝试从队列中检索请求并处理它们。
同步队列只是一个大小限制为0的阻塞队列。这意味着,每次线程尝试添加到队列时,它将阻塞,直到另一个线程尝试从该队列中获取一个项目。如果任何其他线程相同,它们也会阻塞(有公平性设置选项)。
如果没有提交操作,则服务器线程将阻塞,直到有一个可用。
注意,这会导致在服务器线程(main?)中执行操作。如果这不是您想要的,您可以另外将它们交给Executor以在一个或多个线程上运行。这可能听起来像很多开销,但根本不是。
的JavaDoc:
答案 1 :(得分:1)
这可能有所帮助:
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/LockSupport.html
查看用法示例。
答案 2 :(得分:0)
对于每次一个线程访问其中一个同步方法时阻塞的服务器对象,最好使用BlockingQueue。