我在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实例,那么同步该方法即可。你如何测试它没有正确同步? –