簡體   English   中英

Java-線程不想啟動

[英]Java - Thread doesn't want to start

我有這個控制台應用程序,但是由於某種原因,線程的run()方法不想啟動。 該代碼第一次看起來很長,但是我盡了最大的努力來組織它。

結果輸出:

eThread starting!! 

因此,似乎執行了CarManager.startFunctionalities(),但根本沒有執行eThread.start()行,因為沒有打印出“ started”行。

這是源代碼。

主班:

package rpicar.android;


public class AndroidEmulator{


    public static void main(String args[]) throws InterruptedException {
        CarManager cm = new CarManager ("localhost");
    }
}

汽車經理:

package rpicar.android;

import rpicar.common.Direction;
import rpicar.common.EnvironmentData;


public class CarManager {
    private  MotorManager mManager;
    private final String RPIADDRESS = "localhost";
    private Thread mThread; //motor
    private EnvironmentManager eManager;
    private Thread eThread;
    public CarManager(String rpiAddress) {
        //initialize MotorManager
        mManager = new MotorManager(RPIADDRESS);
        //Make a thread for the Motor commands
        mThread = new Thread(mManager);
        //Initialize EnvironmentManager
        eManager = new EnvironmentManager(RPIADDRESS);
        //Makea thread for collecting EnvironmentData
        eThread = new Thread (eThread);
        startFunctionalities();
    }

    public void move(Direction d){
        this.mManager.setDirection(d);
    }

    public EnvironmentData getCurrentEnvironmentData(){
        return this.eManager.getCurrentEnvironmentData();
    }

    private void startFunctionalities(){
        //Start MotorManager for sending movement commands when needed.
        //mThread.start();
        //Start EnvironmentManager to collect EnvironmentData
        System.out.println("eThread starting!! ");
        eThread.start();
    }
}

EnvironmentManager:

package rpicar.android;

import rpicar.common.CarComponent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import rpicar.common.EnvironmentData;


public class EnvironmentManager extends CarComponent implements Runnable{
    private EnvironmentData currentEnvironmentData;

    public EnvironmentManager(String rpiAddress) {
        super(rpiAddress, 2176, true);
        this.currentEnvironmentData = new EnvironmentData();
    }

    public synchronized EnvironmentData getCurrentEnvironmentData() {
        return currentEnvironmentData;
    }

    public synchronized void setCurrentEnvironmentData(EnvironmentData currentEnvironmentData) {
        this.currentEnvironmentData = currentEnvironmentData;
    }

    @Override
    public void run() {
        System.out.println("eThread started!! ");
        super.connect();
        while(true){
            try {
                this.setCurrentEnvironmentData((EnvironmentData) super.in.readObject());
            } catch (IOException ex) {
                super.connect();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(EnvironmentManager.class.getName()).log(Level.SEVERE, null, ex);
            }    
        }

    }
}

在創建eThread實例時,您不小心將線程本身傳遞給了構造函數(或者根據操作順序,傳遞了null )。

您應該將eManager傳遞給構造函數。

 eThread = new Thread (eThread); 

會成為

eThread = new Thread (eManager);

通過將eThread為final字段,可以在將來保護自己免受此錯誤的eThread ,因此在聲明它之前不能使用它。

暫無
暫無

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

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