Java线程未按预期启动/工作
我正在实现一个简单的客户机-服务器体系结构,其中多个客户机应该能够连接到服务器,并且可以在服务器和客户机之间交换字符串 我的想法是,每边都有两个线程:一个侦听器,不断检查inputstream中是否有新的内容;另一个编写器线程,如果有内容要写,则写入套接字 但是,第二个线程甚至没有启动。。。仅显示第一个sysoutJava线程未按预期启动/工作,java,multithreading,sockets,networking,Java,Multithreading,Sockets,Networking,我正在实现一个简单的客户机-服务器体系结构,其中多个客户机应该能够连接到服务器,并且可以在服务器和客户机之间交换字符串 我的想法是,每边都有两个线程:一个侦听器,不断检查inputstream中是否有新的内容;另一个编写器线程,如果有内容要写,则写入套接字 但是,第二个线程甚至没有启动。。。仅显示第一个sysout //start new thread to handle client input new Thread( new ServerWorker(
//start new thread to handle client input
new Thread(
new ServerWorker(clientSocket, this, this.getIdCounter())).start();
System.out.println("server side listener started");
//start new thread to handle client output
new Thread(new ServerWorkerListener(clientSocket)).start();
System.out.println("server side writer started");
以下是来自ServerWorker的一些代码:
public void run() {
try {
OutputStream output = clientSocket.getOutputStream();
while (true) {
// output.write(("Pling!\n\n").getBytes());
for (Client tempClient : server.getClientList()) {
if ((tempClient.getId() == this.id)
&& tempClient.isShouldSend()) {
output.write((tempClient.getOutputStream() + "\n\n")
.getBytes());
tempClient.setInputStream("");
tempClient.setShouldSend(false);
}
}
}
} catch (IOException e) {
System.out.println("Error in serverWorker");
e.printStackTrace();
}
}
我真的不知道我错过了什么
整个服务器工作人员:
公共类ServerWorker实现可运行{
protected Socket clientSocket = null;
protected String serverText = null;
protected int id;
protected Server server;
public ServerWorker(Socket clientSocket, Server server,
int id) {
this.clientSocket = clientSocket;
this.serverText = serverText;
this.id = id;
this.server = server;
}
public void run() {
try {
OutputStream output = clientSocket.getOutputStream();
while (true) {
// output.write(("Pling!\n\n").getBytes());
for (Client tempClient : server.getClientList()) {
if ((tempClient.getId() == this.id)
&& tempClient.isShouldSend()) {
output.write((tempClient.getOutputStream() + "\n\n")
.getBytes());
tempClient.setInputStream("");
tempClient.setShouldSend(false);
}
}
}
} catch (IOException e) {
System.out.println("Error in serverWorker");
e.printStackTrace();
}
}
}
整个ServerWorkerListener:
public class ServerWorkerListener implements Runnable {
private BufferedReader input;
private Socket clientSocket;
public ServerWorkerListener(Socket clientSocket) {
this.clientSocket = clientSocket;
run();
}
@Override
public void run() {
System.out.println("its running");
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
while (true) {
System.out.println("it's looping");
String inputLine = null;
if ((inputLine = in.readLine()) != null) {
JOptionPane.showMessageDialog(null, inputLine, "InfoBox: "
+ "Message from client",
JOptionPane.INFORMATION_MESSAGE);
}
}
} catch (UnknownHostException e) {
System.err.println("Don't know about client");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to client");
System.exit(1);
}
}
}您正在调用ServerWorkerListener的构造函数内部的run,您不能这样做。新线程应该调用run,否则,由于它包含一个无限循环,它将永远不会从构造函数返回,因此永远不会调用线程的构造函数,更不用说它的start方法了。因此,从构造函数中删除run调用应该可以解决问题。ServerWorkerListener的构造函数中是否有任何阻塞代码?能否发布整个ServerWorker和ServerWorkerListener类的源代码?已更新,感谢您的关注!不能在ServerWorkerListener的构造函数内调用run。新线程应该调用run,否则,由于它包含一个无限循环,它将永远不会从构造函数返回,因此永远不会调用线程的构造函数,更不用说它的start方法了。是的!这就是答案。我怎么接受呢?非常感谢你。。。