推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
Java——》线程的打断(停止正在运行的线程)
一、设置标志位
如果线程的run方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否继续。
package com.xiaoxian.demo.thread.interrupt;
import java.util.Date;
public class ThreadInterrupt01 {
/**
* 设计一个线程:运行10秒后被终止(掌握线程的终止方法)
* @param args
*/
public static void main(String[] args) throws Exception {
MyRunable01 runnable = new MyRunable01();
new Thread(runnable).start();
Thread.sleep(10000); // 主线程休眠10秒钟
runnable.flag = false;
System.out.println("main、 end ...");
}
}
class MyRunable01 implements Runnable {
boolean flag = true;
@Override
public void run() {
while (flag) {
try {
Thread.sleep(1000);
System.out.println(new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " 执行完成");
}
}
二、利用中断标志位
在线程中有个中断的标志位,默认是false,当我们显示的调用 interrupted方法或者isInterrupted方法是会修改标志位为true,我们可以利用此来中断运行的线程。
package com.xiaoxian.demo.thread.interrupt;
public class ThreadInterrupt02 extends Thread {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new ThreadInterrupt02();
t1.start();
Thread.sleep(3000);
t1.interrupt(); // 中断线程 将中断标志由false修改为了true
// t1.stop(); // 直接就把线程给kill掉了
System.out.println("main .... ");
}
@Override
public void run() {
System.out.println(this.getName() + " start...");
int i = 0;
// Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
while (!Thread.interrupted()) {
System.out.println(this.getName() + " " + i);
i++;
}
System.out.println(this.getName() + " end .... ");
}
}
三、利用InterruptedException
如果线程因为执行join(),sleep()或者wait()而进入阻塞状态,此时要想停止它,可以让他调用interrupt(),程序会抛出InterruptedException异常。我们利用这个异常可以来终止线程。
package com.xiaoxian.demo.thread.interrupt;
public class ThreadInterrupt03 extends Thread {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new ThreadInterrupt03();
t1.start();
Thread.sleep(3000);
t1.interrupt(); // 中断线程 将中断标志由false修改为了true
// t1.stop(); // 直接就把线程给kill掉了
System.out.println("main .... ");
}
@Override
public void run() {
System.out.println(this.getName() + " start...");
int i = 0;
// Thread.interrupted() 如果没有被中断 那么是false 如果显示的执行了interrupt 方法就会修改为 true
while (!Thread.interrupted()) {
//while(!Thread.currentThread().isInterrupted()){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
System.out.println(this.getName() + " " + i);
i++;
}
System.out.println(this.getName() + " end .... ");
}
}