关于这个问题,先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()
首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了。我们只需瞧瞧suspend(), resume(), stop()这三个就行了;
suspend()——让当前线程暂停执行
resume()——让当前线程恢复执行
当调用suspend()的时候,线程并没有释放对象,因此当多线程的时候,如果其他线程要用到某个被suspend的线程占用的对象,就必须要等到它被resume()才可以,而这个过程就极易出现死锁。
所以,they are deprecated!
而stop()是最不应该的,因为你都不知道它的状态就stop()了,释放所有能释放的锁,而且如果run方法存在同步,还不一定能stop~正反方向,这个方法都不适合。
备注:对于废弃的方法本身了解就可以,更多还是要去分析废弃的原因,如果你喜欢进阶的话~
关于停止一个正在运行的线程,官方建议设置变量去关闭。形同如下:
public class APP { public static void main(String[] args) throws Exception { class MyThread extends Thread { boolean flag = true; @Override public void run() { while (flag) { // do something try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("I‘m running!"); } System.out.println("I‘m dead!"); } public void stopThread() { flag = false; } } MyThread thread = new MyThread(); thread.start(); Thread.sleep(3000); thread.stopThread(); } }
也就是通过设置变量来关闭线程,当然如果你就是执行完一次,那当然就没必要设置变量了,因为这种线程都没必要单独处理停止行为。
其次,这个所说是变量但是这个变量设置还是有很多巧妙的地方,比如下面这中类型:
public class APP { public static void main(String[] args) throws Exception { class MyThread extends Thread { boolean isRunning = true; @Override public void run() { while (isRunning) { // do something try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println(e.getMessage()); isRunning = false; } System.out.println("I‘m running!"); } System.out.println("I‘m dead!"); } } MyThread thread = new MyThread(); thread.start(); Thread.sleep(3000); thread.interrupt(); } }
基本就是这样操作了~
时间: 2024-12-21 00:28:24