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