我在Java中遇到了這個問題。 我有一個名爲MyServer的服務器類,我想實現一個線程池,每個線程在請求發出時運行MyServer的一個方法。我創建了另一個實現了名爲MultiThreadedSocketServer的服務器池的類。類是這樣的:Java中的線程池中的協調問題
public class MultiThreadedSocketServer {
public void startServer(MyServer s, int localport, int threadPoolSize) {
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(threadPoolSize);
Runnable serverTask = new Runnable() {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(localport);
System.out.println("Waiting for clients to connect...");
while (true) {
Socket clientSocket = serverSocket.accept();
clientProcessingPool.submit(new ClientTask(clientSocket, s));
}
} catch (IOException e) {
System.err.println("Unable to process client request");
e.printStackTrace();
}
}
};
Thread serverThread = new Thread(serverTask);
serverThread.start();
}
}
名爲MultiThreadedSocketServer類具有通過它在一個線程創建客戶端Task類參數名爲Server秒。客戶端的任務類是這樣的:
class ClientTask implements Runnable {
private final Socket clientSocket;
private MyServer s;
public ClientTask(Socket clientSocket, MyServer s) {
this.s = s;
this.clientSocket = clientSocket;
}
@Override
public void run() {
System.out.println("Got a client !");
String inputLine = null;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// Do whatever required to process the client's request
inputLine = in.readLine();
if (inputLine.equals("Bye")) {
System.out.println("Bye");
System.exit(0);
}
s.handleRequest(inputLine);
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
正如你可以看到,當請求類的MyServer的的handleRequest方法被調用。我想讓這個方法運行synchronized,意味着一次只能有一個線程能夠運行這個方法。在方法實現之前添加synchronized並沒有達到任何效果。
任何人都可以給我正確的方法來做到這一點? 預先感謝您的時間。
PS:我加入了全碼
的MyServer類 http://pastebin.com/6i2bn5jj
多線程服務器類 http://pastebin.com/hzfLJbCS
由於這是顯而易見的主要創建三個請求用的handleRequest帶參數的任務,TASK2和再見。
正確的輸出將
Waiting for clients to connect...
Got a client !
This is an input Task
Request for Task
Got a client !
This is an input task2
Request for task2
Got a client !
This is an input
Bye
而是順序混合。有時關閉服務器的Bye可以先執行。我想確保訂單是主要創建請求的訂單。
使MyServer.HandleReq()同步將阻止多個線程在同一個MyServer實例**上同時調用該方法**。你有多少個MyServer實例?附註:請尊重命名約定。 –
只有一個MyServer實例會一直運行。 對不起,我不知道命名約定,如果你想澄清我將編輯我的帖子 –
方法開始一個小寫字母。 HandleReq應該是handleReq,或者甚至更好,handleRequest。變量一樣。 ThreadPoolSize應該是threadPoolSize。如果您有一個MyServer實例,那麼同步該方法即可。你如何測試它沒有正確同步? –