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-为什么不在构造函数中启动线程? 如何终止?相关推荐

  1. java中date代替_Java:为什么Date构造函数不推荐,我用什么来代替?

    当Java第一次启动和发展时, java.util.Date , java.util.Calendar和java.text.SimpleDateFormat类被冲得太快了. 这些课程没有很好的devi ...

  2. Java线程中的静态方法_Java多线程3:Thread中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  3. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  4. java中thread实例_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  5. dateformat线程_Java最佳实践–多线程环境中的DateFormat

    dateformat线程 这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建 ...

  6. java睡眠后继续执行_Java高级编程基础:如何使用线程的休眠,中断和连接

    线程休眠和中断 我们知道了在编程过程中创建线程,并启动以后,线程会交由操作系统来管理调度执行一个我们指定的计算任务. 如果没有其它异常情况出现的话,它会持续运行直到我们实现的run()方法执行完毕为止 ...

  7. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...

  8. 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 ...

  9. java集合根据值排序_Java 8:对集合中的值进行排序

    java集合根据值排序 意识到Java 8将在接下来的几周内发布其GA版本之后,我认为现在是时候来看看它了,在过去的一周里,我一直在阅读Venkat Subramaniam的书 . 我要讲的是第3章, ...

  10. Java设计模式应用到数据库_Java设计模式在数据库编程中的应用研究

    Java的广泛使用使得数据编程变得更加简单方便.本当中.当在加载父类的时候,再调用不同的子类,以避免代码文对Java进行了深入的探讨,提供了一种可行的应用Java的重复编写.templatemetho ...

最新文章

  1. 985博士:导师是院士,直到毕业,我们都没单独说过一句话
  2. jTable 滚动条
  3. 深入学习Redis(3):主从复制
  4. Python sys 模块
  5. 解决apktool d file.apk出现Error occured while disassembling class以及apktool源码编译
  6. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
  7. The following module was built either with optimizations enabled or without debug information - winz
  8. SPFA的两个优化:SLF与LLL
  9. android mvp 作用,Android MVP与MVC的区别和理解
  10. python网页动图_python,tensorflow线性回归Django网页显示Gif动态图
  11. 计算机专业性特有的道德要求,什么是通信科学技术人员职业道德的双重性?
  12. Python 程序报错崩溃后,如何倒回到崩溃的位置?
  13. java使用netty
  14. 关于选择,说一个同学的真实故事
  15. 拥塞控制,图文并茂(挺丰富,借鉴较多大佬的思想)
  16. SAE SENT单边半字节传输协议里的CRC4与CRC6检验码编程
  17. 《OpenCV 4.5计算机视觉开发实战(基于VC++)》示例代码免费下载
  18. python机器学习分析影响房价的主要因素
  19. php解密方法,php加密解密的几种方法的使用教程
  20. mysql pdo教程_(唯一合适) PDO 教程

热门文章

  1. 数据压缩原理实验4_DPCM编解码
  2. oracle创建orcl失败,prcr-1079:failed to start resource ora.orcl.db错误的解决办法
  3. 软考高级 系统分析—论文理论知识
  4. 又一次创新!华为新款折叠手机开售!
  5. php Splqueue队列
  6. ETL流程介绍常用实现方法
  7. Spring循环依赖图解
  8. 解决在word中无法使用Ctrl+V进行粘贴的问题
  9. arcgis api for javascript 各个版本的SDK下载
  10. 常见的RuntimeException异常