停止线程主要有三种思路
第一种
使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
第二种
使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
package com.Test;
public class ThreadTest1 extends Thread {
boolean flag = true;
@Override
public void run() {
System.out.println("子线程开始");
while (flag){
System.out.println("跑跑跑跑跑跑跑跑跑跑");
}
System.out.println("子线程结束");
}
public void stopT1(){
System.out.println("调用方法关闭线程");
flag = false;
}
}
class ThreadTest11 {
public static void main(String[] args) throws InterruptedException {
ThreadTest1 t1 = new ThreadTest1();
t1.start();
int i = 0;
while (i<6){
System.out.println(i);
Thread.sleep(1000);
if(i==5){
t1.stopT1();
}
i++;
}
}
}
运行结果:
第三种
使用interrupt方法中断线程。让wait等待的线程,直接中断并抛出一个异常
package com.Test;
public class ThreadTest1 extends Thread {
boolean flag = true;
@Override
public synchronized void run() {
System.out.println("子线程开始");
while (flag) {
try {
//在线程中调用wait方法的时候 要用synchronized锁住对象,确保代码段不会被多个线程调用
wait();
} catch (InterruptedException e) {
System.out.println("异常退出");
// e.printStackTrace();
}
}
System.out.println("子线程结束");
}
}
class ThreadTest11 {
public static void main(String[] args) throws InterruptedException {
ThreadTest1 t1 = new ThreadTest1();
t1.start();
int i = 0;
while (i < 6) {
System.out.println(i);
Thread.sleep(1000);
if (i == 5) {
t1.interrupt();
}
i++;
}
}
}
执行结果: