我正在学习如何在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
}
Run Code Online (Sandbox Code Playgroud)
第一个线程开始第二个像这样:
public class Main {
public static void main(String[] args) throws Exception{
new MyNewThread();
// First thread code there
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但我的编译器标记了一个警告说:在构造函数中启动一个新线程是危险的.为什么是这样?
这个问题的第二部分是:如果我在一个线程中运行一个循环(串口侦听线程),我在第二个线程中键入一个exit命令.如何获得第一个终止线程?谢谢.
为什么在Java中(或者就任何地方而言)在构造函数中开始一个新线程.我收到了Netbeans的警告,但它没有给我任何重构建议.我正在编写一个客户端/服务器Swing应用程序,我正在启动的线程是在服务器的JFrame构造函数中,以便持续监听客户端数据报.
为什么这不是好的做法,我应该如何避免呢?
一个线程在它自己的构造函数中调用this.start()是否合法?如果是这样,这会导致什么样的潜在问题?我知道对象不会完全初始化,直到构造函数运行完成,但除此之外还有其他问题吗?
是否真的可以在构造函数中创建的线程中查看部分构造的对象,因为缺少同步和泄漏此实例?
当然,除了有子类的情况,或者我们正在使用clone或类似的东西进行隐式构造 - 所以让我们假设该类是final,并且在调用其他线程之前调用构造函数的线程中它是完全初始化的.
据我所知,以下hb()规则适用,
线程中的每个操作都发生在该程序顺序中稍后出现的该线程中的每个操作之前(程序顺序规则)
在启动线程中的任何操作之前,对线程的start()调用发生.
如果是hb(x,y)和hb(y,z),那么hb(x,z)
那么它是否意味着以下代码在技术上是线程安全的(我从类似的问题中得到它为什么我不应该在我的类的构造函数中使用Thread.start()?,还有一个类似的问题为什么它是坏的练习在构造函数上创建一个新线程?,ps我希望这个不会被重复关闭)
final class SomeClass
{
public ImportantData data = null;
public Thread t = null;
public SomeClass(ImportantData d)
{
t = new MyOperationThread();
// t.start(); // Footnote 1
data = d;
t.start(); // Footnote 2
}
}
Run Code Online (Sandbox Code Playgroud)
PS显然数据字段在这里缺乏封装,但是这个问题是关于对象从线程t的状态可见性.