2011-02-02 57 views
0

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

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..so op1,opX执行在客户端服务器,它不是服务器线程来执行它..

因此毕竟服务器在运行方法决定启用或禁用op1,op2..opX。 运行方法中的客户端只需调用serverreference.op1()..... serverref.opX()

好吧..现在假设所有3个客户端调用op1,而不是由服务器启用,他们必须等待()和那么其他人必须通知()...但我需要处理这些通知FIFO。并通知不运行在FIFO等待它只是拿起暂停螺纹之一..

我可以使用哪种工具来处理这种情况?

Thx in advice。

回答

2

您可能想要使用阻塞队列。你的情况可能是一个同步队列。

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

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

如果没有正在提交的操作,则服务器线程将会阻塞,直到其中一个变为可用。

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

的JavaDoc:

0

你可能会使用BlockingQueue,而不是服务器对象每次一个线程访问其同步的方法之一阻塞会更好。