繁体   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