我写了一个实现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。这意味着你实际上是在完全构造对象之前给出对对象的引用。该线程将在构造函数完成之前启动。这会导致各种奇怪的行为。
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();