创建了新线程,但没有';t运行(java)

创建了新线程,但没有';t运行(java),java,sockets,Java,Sockets,这是我写的一个小代码。下一个类等待连接,并在收到连接后创建新线程: ServerSocket serverSocket = null; ExecutorService serv = Executors.newCachedThreadPool(); serv.execute(new UserThread()); try { serverSocket = new ServerSocket(FMDataManager.getPort());

这是我写的一个小代码。下一个类等待连接,并在收到连接后创建新线程:

    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()方法等待连接。 线程确实已创建,但不会运行。我在它的构造函数中放了一个小“threadcreated”,在run()中放了另一个消息“starting thread”,但我只收到了第一条消息。在那之后,它没有做任何事情,我甚至没有得到“线程创建”。 有什么想法吗

我已经添加了我正在尝试启动的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();
        }
    }
}
}
公共类UploadThread扩展线程{
插座(u插座),;
公共上传线程(套接字){
超级(“用户线程”);
_插座=插座;
}
公共无效运行(套接字){
System.out.println(“entred上传线程”);
DataOutputStream out=null;
DataInputStream in=null;
试一试{
out=新的DataOutputStream(_socket.getOutputStream());
in=新的DataInputStream(_socket.getInputStream());
文件消息输入消息;
发送文件输出消息;
inputMessage=(FileMessage)CommandEnum.readMessage(in);
System.out.println(“F:+inputMessage.getCaption());
File=null;
迭代器itr=FMDataManager.getFiles().Iterator();
while(itr.hasNext()){
File temp=itr.next();
if(temp.getName().equals(inputMessage.getFile()))
文件=临时文件;
}
outputMessage=新发送文件(文件);
outputMessage.send(out);
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
_socket.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}

如果看不到实际构造线程的代码部分,我猜您没有在thread对象上调用“start()”方法

必须是这样的:

Thread thr = new Thread(new Runnable() { void run() { /* do stuff */ }) ;

thr.start() // GO!
@Override
public void run(){
    //do stuff
}
尝试
serv.submit
而不是
serv.execute

编辑

看起来
UploadThread
没有正确重写
run()
。也就是说,您的运行方法声明应该如下所示:

Thread thr = new Thread(new Runnable() { void run() { /* do stuff */ }) ;

thr.start() // GO!
@Override
public void run(){
    //do stuff
}

没有必要将
socket
作为参数传递。

正如Sthupahsmat的评论所指出的,您的
上传线程
实现是错误的。
run()
方法的签名是
public void run()
。当前,您正在创建一个带有签名的新方法
public void run(Socket)
。由于
run()
不接受任何参数,因此必须通过构造函数或设置器传递所有参数

有两种最佳做法可以帮助您避免将来出现此类错误:

  • 无论何时实现或重写方法,请使用
    @override
    对其进行注释。如果使用
    @Override
    创建新方法,编译器将发出错误信号
  • 不要扩展
    线程
    ,而是实现
    可运行
    <代码>线程有一个默认的
    run()
    实现,它什么都不做。这就是当前代码所发生的情况

这是我用来调用线程的:serv.execute(newuploadThread(serverSocket.accept());Its应该创建它并运行它UploadThead(),这是您正在使用的构造之一或API的一部分?ExecutorService应该在将来某个时候启动提交的线程为什么会被选中
ExecutorService
是一个比
Thread
更高级别的概念,它采用
Runnable
并执行它认为必须执行的操作。不需要创建一个线程并启动它。所以,我仍然不知道该怎么做。想法?我们有没有可能看到您的
UploadThread
实现`?特别是类签名、构造函数和(开始的)run方法(包括方法签名)看起来好像你没有正确地重写
run()
。好吧,我怎么会错过这个问题已经得到了回答呢?我想我没有重新加载浏览器选项卡,看到了昨天的缓存版本。我让这个答案作为Sthupahsmat答案的补充。