Java多线程停止方法
如果我们访问一个使用stop()方法停止的线程,将会发生什么 无论如何,在java8中stop()方法是不推荐的,但是需要上面的输出。是否可以访问处于终止状态的已停止线程Java多线程停止方法,java,multithreading,Java,Multithreading,如果我们访问一个使用stop()方法停止的线程,将会发生什么 无论如何,在java8中stop()方法是不推荐的,但是需要上面的输出。是否可以访问处于终止状态的已停止线程 提前感谢。为什么Thread.stop不推荐使用? 因为它本质上是不安全的。停止线程会导致其解锁 它已锁定的所有监视器。(监视器将在以下情况下解锁: ThreadDeath异常会向堆栈上传播。)如果任何对象 以前受这些监视器保护的设备处于不一致状态, 其他线程现在可能以不一致的状态查看这些对象。 据说这些物体已经损坏了。当螺纹
提前感谢。为什么Thread.stop不推荐使用? 因为它本质上是不安全的。停止线程会导致其解锁 它已锁定的所有监视器。(监视器将在以下情况下解锁: ThreadDeath异常会向堆栈上传播。)如果任何对象 以前受这些监视器保护的设备处于不一致状态, 其他线程现在可能以不一致的状态查看这些对象。 据说这些物体已经损坏了。当螺纹在损坏的螺纹上工作时 对象,则可能导致任意行为。这种行为可能很微妙 而且很难被发现,或者很难发音。不同于其他 未经检查的异常,ThreadDeath会无声地终止线程;因此 用户没有程序可能已损坏的警告。腐败 在实际伤害发生后的任何时候都可以显现出来,甚至 未来几小时或几天 我应该使用什么来代替线程。停止? stop的大多数用法都应该被只修改某些代码的代码所取代 变量,指示目标线程应停止运行。这个 目标线程应定期检查此变量,并从 如果变量指示 就是停止跑步。确保客户及时沟通 停止请求时,变量必须是可变的(或访问该变量) 必须同步) 例如,假设小程序包含以下启动、停止和运行方法:
private Thread blinker;
public void start() {
blinker = new Thread(this);
blinker.start();
}
public void stop() {
blinker.stop(); // UNSAFE!
}
public void run() {
while (true) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
通过将小程序的停止和运行方法替换为以下方法,可以避免使用Thread.stop:
专用易失性线程闪烁器
public void stop() {
blinker = null;
}
public void run() {
Thread thisThread = Thread.currentThread();
while (blinker == thisThread) {
try {
Thread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
如果您有兴趣查看调用
stop
后线程的状态,可以通过在测试类定义之前添加@SuppressWarnings(“deprecation”)
来抑制deprecation警告。例如,请尝试以下代码:
@SuppressWarnings("deprecation")
class test {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
while(true) {
try {
Thread.sleep(1000);
}catch(Exception e) {}
}
}
};
t.start();
System.out.println(t.getName());
System.out.println(t.getState());
t.stop();
try {
Thread.sleep(1000); // wait for stop to take effect
}catch(Exception e) {}
System.out.println(t.getState());
}
}
扰流板警报:状态为“已终止”建议不要在Thread类中使用stop()方法,因为该方法已被弃用
如果要中止线程执行,请使用中断()
有关中断的更多详细信息,请参阅
@SuppressWarnings("deprecation")
class test {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
while(true) {
try {
Thread.sleep(1000);
}catch(Exception e) {}
}
}
};
t.start();
System.out.println(t.getName());
System.out.println(t.getState());
t.stop();
try {
Thread.sleep(1000); // wait for stop to take effect
}catch(Exception e) {}
System.out.println(t.getState());
}
}
class IntThread extends Thread{
public void run(){
try{
Thread.sleep(1000);
System.out.println("Didn't Interrupt me !!!");
}catch(InterruptedException e){
throw new RuntimeException("Thread interrupted..."+e);
}
}
public static void main(String args[]){
IntThread t1=new IntThread();
t1.start();
try{
t1.interrupt();
}catch(Exception e){System.out.println("Exception handled "+e);}
}
}