2011-02-02 76 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,而不是服務器對象每次一個線程訪問其同步的方法之一阻塞會更好。