java构造函数中启动线程_java-为什么不在构造函数中启动线程? 如何终止?
java-为什么不在构造函数中启动线程? 如何终止?
我正在学习如何在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
}
}
这可行,但是我的编译器会标出警告语:在构造函数中启动新线程很危险。 为什么是这样?
该问题的第二部分是:如何在一个线程(串行端口侦听线程)中运行循环,并在第二个线程中键入退出命令。 如何获得第一个终止的线程? 谢谢。
4个解决方案
45 votes
对于第一个问题:在传递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();
Justin Waugh answered 2020-07-05T04:21:07Z
9 votes
让我们看一个基本的例子:
class MyClass implements Runnable{
int a = 0;
String b = null;
public MyClass(){
new Thread(this).start();
b = "Foo";
}
public void run(){
a = b.length(); //can throw NullPointerException
}
}
在这种情况下,可以说MyClass.this逃脱了构造函数。 这意味着该对象可用于引用,但是可能无法创建在构造函数中构建的所有对象。 如果b为final,则将其提升到另一个水平,您希望它可用,但不能保证。 这被称为部分构造的对象,在Java中完全合法。
John Vint answered 2020-07-05T04:21:32Z
0 votes
关于第二个问题,您可以通过2952541841801081085952方法检查第二个线程是否已终止,如果是,请使用2952541841801081085953关键字关闭第一个线程的循环,然后在无需执行任何操作时将终止
public class MyNewThread implements Runnable {
Thread t;
MyNewThread() {
t = new Thread (this, "Data Thread");
t.start();
}
public void run() {
reading code ................
// New Thread code here
}
public class Main {
public static void main(String[] args) throws Exception{
MyNewThread thread = new MyNewThread();
while(true)
{
listening code ...................
if(!thread.t.isAlive())
break;
}
}
}
user1841718 answered 2020-07-05T04:21:52Z
-3 votes
这个问题的第二部分是: 如果我有一个循环运行 线程(串行端口侦听线程) 然后在我的电脑上输入退出命令 第二个线程。 我如何获得第一个 线程终止?
让它一直循环直到达到条件为止。 例如:
public void run() {
while ( !inputConsole.getCommand().equals("exit") ) {
//Do Something
Thread.sleep(1000); //put thread to sleep for 1 second
}
}
Mike Thomsen answered 2020-07-05T04:22:17Z
java构造函数中启动线程_java-为什么不在构造函数中启动线程? 如何终止?相关推荐
- java中date代替_Java:为什么Date构造函数不推荐,我用什么来代替?
当Java第一次启动和发展时, java.util.Date , java.util.Calendar和java.text.SimpleDateFormat类被冲得太快了. 这些课程没有很好的devi ...
- Java线程中的静态方法_Java多线程3:Thread中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...
- Java中Thread中的实例方法_Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...
- java中thread实例_Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...
- dateformat线程_Java最佳实践–多线程环境中的DateFormat
dateformat线程 这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建 ...
- java睡眠后继续执行_Java高级编程基础:如何使用线程的休眠,中断和连接
线程休眠和中断 我们知道了在编程过程中创建线程,并启动以后,线程会交由操作系统来管理调度执行一个我们指定的计算任务. 如果没有其它异常情况出现的话,它会持续运行直到我们实现的run()方法执行完毕为止 ...
- java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...
- java中堆栈溢出_java – 由于堆栈溢出,C中通常会发生什么?
In C I'm aware that an array index out of bounds will produce a segmentation fault. Is it the same f ...
- java集合根据值排序_Java 8:对集合中的值进行排序
java集合根据值排序 意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 . 我要讲的是第3章, ...
- Java设计模式应用到数据库_Java设计模式在数据库编程中的应用研究
Java的广泛使用使得数据编程变得更加简单方便.本当中.当在加载父类的时候,再调用不同的子类,以避免代码文对Java进行了深入的探讨,提供了一种可行的应用Java的重复编写.templatemetho ...
最新文章
- 985博士:导师是院士,直到毕业,我们都没单独说过一句话
- jTable 滚动条
- 深入学习Redis(3):主从复制
- Python sys 模块
- 解决apktool d file.apk出现Error occured while disassembling class以及apktool源码编译
- yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
- The following module was built either with optimizations enabled or without debug information - winz
- SPFA的两个优化:SLF与LLL
- android mvp 作用,Android MVP与MVC的区别和理解
- python网页动图_python,tensorflow线性回归Django网页显示Gif动态图
- 计算机专业性特有的道德要求,什么是通信科学技术人员职业道德的双重性?
- Python 程序报错崩溃后,如何倒回到崩溃的位置?
- java使用netty
- 关于选择,说一个同学的真实故事
- 拥塞控制,图文并茂(挺丰富,借鉴较多大佬的思想)
- SAE SENT单边半字节传输协议里的CRC4与CRC6检验码编程
- 《OpenCV 4.5计算机视觉开发实战(基于VC++)》示例代码免费下载
- python机器学习分析影响房价的主要因素
- php解密方法,php加密解密的几种方法的使用教程
- mysql pdo教程_(唯一合适) PDO 教程