Java thread.stop()如何工作?

GMs*_*soF 8 java multithreading

我实际上正在寻找一种更简单的方法来杀死线程,无论线程在哪里运行.但是互联网上的大多数解决方案都指向我使用布尔标志来控制线程的执行,如果我想停止线程然后将布尔变量设置为false.

但是如果runnable中的任务是一个LONG线性任务,这意味着任务不重复怎么办?在这种情况下,创建一个'while'循环来覆盖整个任务块并不容易.

使用Thread.stop真是太流行了,但警告"Deprecated"似乎使用起来非常危险.我已经阅读了这篇文章 为什么Thread.stop,Thread.suspend,Thread.resume和Runtime.runFinalizersOnExit已弃用?

但我无法理解

如果先前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可以以不一致的状态查看这些对象.据说这些物体已被损坏.

"不一致状态"是什么意思?如果有人能解释一下,我很感激.

我希望将我的问题扩展到更低层次的视图,比如i = i + 1;在JVM(也许是汇编语言)中,也许这个Java语句将被分成几个较小的指令,例如move i ; add i ; get i into memory 0x0101(这是一个例子!我完全不喜欢)知道汇编语言!)

现在,如果我们调用thread.stop,它实际上会停在哪里?线程是否会在COMPLETED Java语句之后停止,或者可能位于"汇编语言"的中间?如果答案是第二个,那么我们说的原因是不是

据说这些物体已被损坏.

好吧,我的问题有点困惑,希望有人能理解和解释.提前致谢.

Mar*_*nik 5

"受损对象"是一个高级概念,它不会发生在JVM级别.程序员通过使用锁保护关键部分来设计他的类,并考虑到线程安全.他的班级是一个不变的,每个关键部分要么全部运行,要么根本不运行.当你stop一个线程时,一个关键部分可能在中间被中断,因此破坏了不变量.那时物体被损坏了.

停止一个线程隐藏了更多的危险,比如没有执行清理,没有释放获得的资源等.如果一个线程没有放弃它正在做的事情,就没有办法让它停止而不会损害整个应用程序.

实际上,每当有人需要运行可能需要强制中止的外来代码时,这必须在一个单独的过程中完成,因为杀死进程至少执行操作系统级别的清理并且更好地控制损坏.


nos*_*nos 3

“不一致状态”是指您的应用程序关心的数据状态,即您的应用程序逻辑通过使用锁/监视器等使应用程序线程安全而精心生成的状态。

想象一下你有这个简单的方法:

public synchronized void doSomething() 
{
      count++;
      average = count/total;
}
Run Code Online (Sandbox Code Playgroud)

由于多个线程正在使用该对象,因此该方法与其他方法是同步的。也许有一个

public synchronized AverageAndCount getMeasurement() 
{
   return new AverageAndCount(average, count);
}
Run Code Online (Sandbox Code Playgroud)

这确保了线程无法读取不完整的测量值,即,如果当前测量值正在内部计算,例如 doSomething(),getMeasurement() 将阻塞/等待,直到计算完成。

现在,假设 doSomething 在线程中运行,并且您调用.stop()该线程。

因此,线程可能会在执行后立即停止 count++;,所持有的监视器被解锁,并且该方法终止并且average = count/total;不执行,

这意味着数据现在不一致。之后任何调用 getMeasurement() 的人现在都会得到不一致的数据。

另请注意,此时这是否发生在 java 语句级别或较低级别并不是很相关,数据可能处于不一致的状态,在任何情况下都无法推理。