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

以上是 Java为什么不在构造函数中启动线程?如何终止? 的全部内容, 来源链接: utcz.com/qa/429793.html

回到顶部