Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程停止方法_Java_Multithreading - Fatal编程技术网

Java多线程停止方法

Java多线程停止方法,java,multithreading,Java,Multithreading,如果我们访问一个使用stop()方法停止的线程,将会发生什么 无论如何,在java8中stop()方法是不推荐的,但是需要上面的输出。是否可以访问处于终止状态的已停止线程 提前感谢。为什么Thread.stop不推荐使用? 因为它本质上是不安全的。停止线程会导致其解锁 它已锁定的所有监视器。(监视器将在以下情况下解锁: ThreadDeath异常会向堆栈上传播。)如果任何对象 以前受这些监视器保护的设备处于不一致状态, 其他线程现在可能以不一致的状态查看这些对象。 据说这些物体已经损坏了。当螺纹

如果我们访问一个使用stop()方法停止的线程,将会发生什么

无论如何,在java8中stop()方法是不推荐的,但是需要上面的输出。是否可以访问处于终止状态的已停止线程


提前感谢。

为什么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);}  

}  
}