小编典典

Java为什么不在构造函数中启动线程?如何终止?

java

我写了一个实现Runnable的类,以同时运行到另一个线程。主线程处理侦听串行端口,而第二个线程将处理向该端口发送数据。

public class MyNewThread implements Runnable {
    Thread t;

    MyNewThread() {
        t = new Thread (this, "Data Thread");
        t.start();
    }

    public void run()  {
        // New Thread code here 
    }

第一个线程从第二个开始,如下所示:

public class Main {
    public static void main(String[] args) throws Exception{
        new MyNewThread();
        // First thread code there
    }  
}

这可行,但是我的编译器会标出警告语:在构造函数中启动新线程很危险。为什么是这样?

这个问题的第二部分是:如何在一个线程(串行端口侦听线程)中运行循环,并在第二个线程中键入退出命令。如何获得第一个终止的线程?谢谢。


阅读 898

收藏
2020-03-15

共1个答案

小编典典

你的第一个问题:在构造函数中启动一个线程,并传递this escapes this。这意味着你实际上是在完全构造对象之前给出对对象的引用。该线程将在构造函数完成之前启动。这会导致各种奇怪的行为。

关于第二个问题:在Java中没有强制其他线程停止的方法,因此你将使用一个变量,线程将检查该变量以知道是否应该停止。另一个线程将其设置为指示第一个线程将停止。该变量必须是易失性的,或者所有访问都必须同步,以确保正确发布。这是一些你想要的代码。

public class MyNewThread implements Runnable {

    private final Thread t;
    private volatile boolean shouldStop = false;

    MyNewThread() {
        t = new Thread (this, "Data Thread");
    }

    public void start() {
        t.start();
    }

    public void stop() {   
         shouldStop = true;
    }

    public void run()  {
         while(!shouldStop)
         {
             // do stuff
         }
    }
}

任何想要创建和启动线程的方法都会:

MyNewThread thread = new MyNewThread();
thread.start();

想要停止线程的任何事情都会做:

thread.stop();
2020-03-15