новый поток создан, но не запускается (Java) - PullRequest
2 голосов
/ 17 мая 2011

вот небольшой код, который я написал. Следующий класс ожидает подключения и создает новый поток при получении:

    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();
        }
    }
}
}

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Попробуйте serv.submit вместо serv.execute.

EDIT

Похоже, UploadThread неправильно переопределяет run(). При этом объявление метода run должно выглядеть так:

@Override
public void run(){
    //do stuff
}

Нет необходимости передавать socket в качестве аргумента.

1 голос
/ 18 мая 2011

Как указано в комментарии sthupahsmaht, ваша UploadThread реализация неверна. Подпись для метода run(): public void run(). В настоящее время вы создаете новый метод с подписью public void run(Socket). Поскольку run() не принимает никаких аргументов, вы должны передать все параметры через конструктор или установщики.

Существуют две лучшие практики, которые помогут вам избежать таких ошибок в будущем:

  • Каждый раз, когда вы реализуете или переопределяете метод, аннотируйте его с помощью @Override. Если вы создаете новый метод с @Override, компилятор выдает ошибку.
  • Не расширяйте Thread, но реализуйте Runnable. Thread имеет реализацию по умолчанию для run(), которая ничего не делает. Это то, что происходит с вашим кодом в настоящее время.
0 голосов
/ 17 мая 2011

Не видя части кода, которая фактически создает поток, я думаю, вы НЕ вызываете метод 'start ()' для объекта потока.

Должно быть что-то вроде этого:

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

thr.start() // GO!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...