我正在学习如何在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();