Java - 线程不想启动

时间:2016-02-02 17:05:38

标签: java multithreading

我有这个控制台应用程序,但由于某种原因,线程的run()方法并不想启动。代码似乎是第一次很长,但我尽可能地组织它。

结果输出:

eThread starting!! 

所以似乎CarManager.startFunctionalities()被执行了,但是eThread.start()行根本没有被执行,因为行"开始"没有打印出来。

这是源代码。

主要班级:

package rpicar.android;


public class AndroidEmulator{


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

CarManager:

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

    }
}

1 个答案:

答案 0 :(得分:4)

当您创建eThread的实例时,您不小心将线程本身传递给构造函数(或者根据操作的顺序,传递null)。

您应该将eManager传递给构造函数。

eThread = new Thread (eThread);

会变成

eThread = new Thread (eManager);

您可以通过将eThread设为最终字段来保护自己免于此错误,因此在声明之前不能使用它。