【问题标题】:How to terminate a thread even if it has not finished running?即使线程没有完成运行,如何终止它?
【发布时间】:2014-02-03 02:56:04
【问题描述】:

无论是否创建了一些对象,我的程序都会启动一个线程。

Foo() {
   t = new Thread(this);
   t.start();
}

我正在我的线程中运行一些 while 循环。

while(bool){
   // do something
}

我有一个线程控制 boolean bool 的值。但是如何在我的其他线程更改布尔值之前终止其中的一些?我认为设置 t = null 不起作用。有没有办法在线程停止运行之前对其进行垃圾收集?

【问题讨论】:

  • Thread 实例与底层执行线程无关。 GC 不会神奇地导致线程停止执行,就像 GC 文件实例不会删除文件一样。
  • 需要注意的是bool必须是volatile boolean,所以它可以被多个线程更改和读取。
  • 不要从构造函数启动线程。新线程可以观察到处于未初始化状态的新对象。即使 start 调用位于构造函数的末尾,也可能会发生这种情况,因为内存排序问题。改为编写静态工厂方法,在那里构造对象,然后然后启动线程。

标签: java multithreading terminate


【解决方案1】:

将循环改为

while (bool && !Thread.interrupted()) {
    // do something
}

当你想停止线程时,调用

t.interrupt();

祝你好运。

【讨论】:

  • 或者更好的是,删除布尔值,因为它用于做与中断标志已经做的事情相同的事情。
  • 他可能在循环中使用 bool 来控制它而不是 break。 :)
  • 最好使用Thread.currentThread().isInterrupted(),这样就不会清除中断状态。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多