gpt4 book ai didi

java - 为什么不在构造函数中启动线程?如何终止?

转载 作者:IT老高 更新时间:2023-10-28 20:36:34 29 4
gpt4 key购买 nike

我正在学习如何在 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 中没有可接受的强制另一个线程停止的方法,因此您将使用一个变量,该线程将检查它是否应该停止。另一个线程将设置它以指示第一个线程将停止。该变量必须是易失的或所有访问同步以确保正确发布。这里有一些你想要的代码。

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 - 为什么不在构造函数中启动线程?如何终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5623285/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com