这是我写的一些代码。下一个类等待连接并在收到一个新线程时创建一个新线程:
ServerSocket serverSocket = null;
ExecutorService serv = Executors.newCachedThreadPool();
serv.execute(new UserThread());
try {
serverSocket = new ServerSocket(FMDataManager.getPort());
serverSocket.setSoTimeout(0);
while (_listening){
System.out.println("Listening on port "+FMDataManager.getPort());
System.out.println("Waiting for connections.");
serv.execute(new UploadThread(serverSocket.accept()));
}
} catch (IOException e) {
System.err.println("Could not listen on port: "+FMDataManager.getPort()+".");
System.exit(-1);
}
正如您所看到的,我正在使用ServerSocket.accept()方法来等待连接。 确实创建了线程,但它不会运行。我在其构造函数中添加了一个“线程创建”,并在run()中添加了另一条消息“启动线程”,但我只获得了第一条消息。之后它没有做任何事情,我甚至没有得到“线程创建”。 有什么想法吗?
我添加了我试图启动的UploadThread的实现,也许它会帮助
public class UploadThread extends Thread{
Socket _socket;
public UploadThread(Socket socket) {
super("UserThread");
_socket = socket;
}
public void run(Socket socket) {
System.out.println("entred upload thread");
DataOutputStream out = null;
DataInputStream in = null;
try {
out = new DataOutputStream(_socket.getOutputStream());
in = new DataInputStream(_socket.getInputStream());
FileMessage inputMessage;
SendFile outputMessage;
inputMessage = (FileMessage) CommandEnum.readMessage(in);
System.out.println("F: "+inputMessage.getCaption());
File file = null;
Iterator<File> itr = FMDataManager.getFiles().iterator();
while (itr.hasNext()){
File temp = itr.next();
if (temp.getName().equals(inputMessage.getFile()))
file = temp;
}
outputMessage = new SendFile(file);
outputMessage.send(out);
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
_socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
答案 0 :(得分:2)
尝试使用 serv.submit
代替serv.execute
。
修改强>
看起来UploadThread
未正确覆盖run()
。话虽这么说,你的run方法声明应如下所示:
@Override
public void run(){
//do stuff
}
无需将socket
作为参数传递。
答案 1 :(得分:1)
正如sthupahsmaht的评论所示,您UploadThread
的实施是错误的。 run()
方法的签名为public void run()
。目前,您正在使用签名public void run(Socket)
创建新方法。由于run()
不接受任何参数,您必须通过构造函数或setter传递所有参数。
有两种最佳做法可以帮助您避免将来出现此类错误:
@Override
对其进行注释。如果使用@Override
创建新方法,则编译器会发出错误信号。Thread
,而是实施Runnable
。 Thread
有一个run()
的默认实现,它什么都不做。这就是您当前的代码所发生的情况。答案 2 :(得分:-2)
没有看到实际构造线程的代码部分,我猜你不会在线程对象上调用'start()'方法。
需要这样的事情:
Thread thr = new Thread(new Runnable() { void run() { /* do stuff */ }) ;
thr.start() // GO!