一、停止线程的三种方式
停止线程是多线程中的一个很重要的点,停止线程意味着在线程处理完当前任务之前终止正在做的操作,但是如果不能正确的操作,可能会发生不可预期的结果。
1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;
2)使用Thread.stop()方法强行终止线程,但是不推荐这种方法,因为stop和suspend以及resume方法一样,都是作废过期的方法,使用它们可能会产生不可预料的结果;
3)使用interrupt方法。
二、使用interrupt方法
举两个栗子:
栗子一
栗子二
抛异常方式终止线程:举个栗子
public class StopThread2 extends Thread { /* public void run() { for (int i = 0; i < 200000; i++){ if(this.interrupted()){ System.out.println("当前线程已经中断,循环即将退出"); break; } System.out.println(i); } //通过break方式不行,break只能终止循环,不能终止线程,还是抛异常吧 System.out.println("for循环虽然终止了,我还在运行"); } */ @Override public void run() { try { for (int i = 0; i < 200000; i++){ if(this.interrupted()){ System.out.println("当前线程已经中断"); throw new InterruptedException(); } System.out.println(i); } } catch (InterruptedException e) { System.out.println("进入catch块,线程即将退出"); e.printStackTrace(); } } }
三、线程的暂停
线程的暂停方法为suspend(),线程的恢复方法为resume(),来看看api上的说明
这两个方法已经被弃用,所以我们不做过多解释。
四、yield()方法
yield()方法是Thread类的静态方法,作用是放弃当前的CPU资源,将它让给其他任务去占用CPU执行时间,但是这个‘其他任务’并不确定,有可能刚刚放弃,然后马上又获得CPU时间片
举个栗子:
public class YieldThread extends Thread { @Override public void run() { super.run(); long startTime = System.currentTimeMillis(); for(int i = 0; i < 500000; i++){ //测试有无yield()方法的时候的耗时 //Thread.yield(); i++; } long endTime = System.currentTimeMillis(); System.out.println("耗时:" + (endTime - startTime) + "毫秒"); } } public class TestClass { public static void main(String[] args) { Thread thread = new YieldThread(); thread.start(); } } 运行结果: 无yield方法:耗时:3毫秒 有yield方法:耗时:145毫秒