我正在学习如何在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
    }
}

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

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

最佳答案

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

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

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

09-16 04:09