簡體   English   中英

創建了新線程,但沒有運行(java)

[英]new thread is created, but doesn't run (java)

這是我寫的一些代碼。 下一個類等待連接,並在收到一個連接后創建一個新線程:

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

嘗試使用 serv.submit而不是 serv.execute

編輯

看起來UploadThread沒有正確覆蓋run() 話雖如此,您的run方法聲明應如下所示:

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

無需將socket作為參數傳遞。

如sthupahsmaht的評論所示,您的UploadThread實現是錯誤的。 run()方法的簽名是public void run() 當前,您正在使用簽名public void run(Socket)創建一個新方法。 由於run()不接受任何參數,因此您必須通過構造函數或setter傳遞所有參數。

有兩種最佳做法可以幫助您將來避免此類錯誤:

  • 每當您實現或重寫方法時,請使用@Override對其進行注釋。 如果使用@Override創建新方法,則編譯器會發出錯誤消息。
  • 不要擴展Thread而是實現Runnable Thread具有run()的默認實現,該默認實現不執行任何操作。 這就是您的代碼當前發生的情況。

在沒有看到實際構造線程的代碼部分的情況下,我想您不會在線程對象上調用'start()'方法。

需要是這樣的:

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

thr.start() // GO!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM