一、停止线程的三种方式
停止线程是多线程中的一个很重要的点,停止线程意味着在线程处理完当前任务之前终止正在做的操作,但是如果不能正确的操作,可能会发生不可预期的结果。
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 = ; i < ; 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毫秒