Java thread.stop()是如何工作的?

Java thread.stop()是如何工作的?,java,multithreading,Java,Multithreading,实际上,我正在寻找一种更简单的方法来终止线程,而不管线程在哪里运行。但是internet中的大多数解决方案都要求我使用布尔标志来控制线程的执行,如果我想停止线程,那么就将布尔变量设置为false 但是,如果runnable中的任务是一个长的线性任务,这意味着该任务没有重复,该怎么办?在这种情况下,创建覆盖整个任务块的“while”循环并不容易 使用Thread.stop确实很有诱惑力,但使用“弃用”警告似乎相当危险。我已通读了这篇文章 但我不明白 如果以前受这些监视器保护的任何对象处于 在不一

实际上,我正在寻找一种更简单的方法来终止线程,而不管线程在哪里运行。但是internet中的大多数解决方案都要求我使用布尔标志来控制线程的执行,如果我想停止线程,那么就将布尔变量设置为false

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

使用Thread.stop确实很有诱惑力,但使用“弃用”警告似乎相当危险。我已通读了这篇文章

但我不明白

如果以前受这些监视器保护的任何对象处于 在不一致的状态下,其他线程现在可能以不同的方式查看这些对象 不一致状态。据说这些物体已经损坏了

“不一致状态”是什么意思?如果有人能解释一下,我将不胜感激

我想把我的问题扩展到一个更低的层次,比如说
I=I+1
在JVM中(可能类似于汇编语言),可能这个Java语句将被拆分为几个较小的指令,例如
move i;加一;将我放入内存0x0101
(这是一个示例!我完全不懂汇编语言!)

现在,如果我们调用thread.stop,它实际上会停在哪里?线程在完成java语句后是否停止,或者可以处于“汇编语言”的中间?如果答案是第二个,我们说的原因是什么

据说这些物体已经损坏了

?

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

受损对象是一个高级概念,它不会发生在JVM级别。程序员在设计类时,考虑到线程安全,用锁保护关键部分。每个关键部分要么全部运行,要么根本不运行,这是他的类的不变量。当你<代码>停止< /代码>一个线程时,一个关键部分可能在中间被中断,从而破坏了不变量。这时物体被损坏了

停止一个线程会隐藏更多的危险,如未执行清理、未释放已获取的资源等。如果一个线程不放弃它正在做的事情,就无法在不影响整个应用程序的情况下使其停止


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

我不是专家,但这是我的想法。 如果使用
Thread.stop()
会导致
ThreadDeath
异常,该异常将导致释放所有监视器。 既然你挑起了一个例外,你就是在对事物的状态施加一种不自然的行为


依赖这些监视器的其他线程可能会进入不一致的情况,因为它们不希望出现这种情况。我认为你甚至不能预知监视器释放的顺序。

< P>我认为,关注的是线程可能在同步块的中间,对对象的成员进行多步更新。如果线程突然停止,则会发生一些更新,但不会发生其他更新,现在对象的状态可能会使其无法使用

我怀疑ThreadDeath处理是否会释放由
AbstractQueuedSynchronizer
支持的
锁,这可能会使应用程序处于某种死锁的路径上

在长代码序列的任何逻辑点,您都可以简单地添加:

if (Thread.interrupted())  {
    throw new InterruptedException();
}
…如果确定在执行长时间运行任务的
线程上调用了
线程.interupt()
,则此时将退出执行。

不一致状态表示应用程序关心的数据状态,声明您的应用程序逻辑已通过使用锁/监视器等使应用程序线程安全而仔细生成

假设你有一个简单的方法:

public synchronized void doSomething() 
{
      count++;
      average = count/total;
}
此方法与其他方法是同步的,因为多个线程正在使用此对象。 也许有一个

public synchronized AverageAndCount getMeasurement() 
{
   return new AverageAndCount(average, count);
}
这可以确保线程无法读取不完整的测量值,即,如果当前测量值正在内部计算,例如doSomething(),则getMeasurement()将阻塞/等待,直到完成

现在,假设doSomething在一个线程中运行,并在该线程上调用
.stop()

因此,线程可能在执行
count++之后立即停止
,保持的监视器被解锁,方法终止,并且
平均值=计数/总数未执行

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


另外请注意,在这一点上,无论是在java语句级别还是在较低级别上发生这种情况,都不是很相关,数据可能处于不一致的状态,您在任何情况下都无法对此进行推理。

停止线程的方法不明确。实际上,每当运行()时都不推荐stop()方法方法完成或发生任何异常,然后停止线程。使用布尔标志变量。默认情况下为“false”

相关问题