守护线程
java中所有的线程分为两类, 一类是守护线程, 一类是非守护线程(又称为用户线程)。
当java中所有的用户线程结束后, 无论此时守护线程的代码是否执行完成, 都会被强行中止, 整个java程序结束。
后台线程
public final void setDaemon(boolean on)
Daemon 代码跟随下面这amn的代码执行,时间受“被保护 ”线程的运行时间所控制
public class Demo20 {
public static void main(String[] args) throws InterruptedException {
WuJiang dianWei = new WuJiang();
dianWei.setName("典韦");
dianWei.setDaemon(true);
dianWei.start();
WuJiang xiaHouDun = new WuJiang();
xiaHouDun.setName("夏侯惇");
xiaHouDun.setDaemon(true);
xiaHouDun.start();
ComputeThread aman = new ComputeThread();
aman.setName("阿瞒");
aman.start();
}
}
(这两段代码相关)
class WuJiang extends Thread {
@Override
public void run() {
for (int i = 0; i < 10;) {
System.out.println(getName() + "正在战场上厮杀 -> " + (i + 1));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ComputeThread extends Thread {
@Override
public void run() {
long num=0;
//100亿次for循环
for (long i = 0; i < 10000000000L; i++) {
num++;
}
}
}
输出结果
中断线程(重要)
public final void stop() 纯了解
public void interrupt() / public boolean isInterrupted()
Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常)
stop法
WuJiang ziLong = new WuJiang();
ziLong.setName("子龙");
ziLong.start();
TimeUnit.SECONDS.sleep(5);
//主线程就是诸葛亮, 等待5s后, 让子龙收手佯装撤退
System.out.println("子龙, 准备撤退");
//不推荐使用, 单方面的中止
ziLong.stop();
interrupt法
WuJiang ziLong = new WuJiang();
ziLong.setName("子龙");
ziLong.start();
TimeUnit.SECONDS.sleep(5);
ziLong.interrupt();
class WuJiang extends Thread {
@Override
public void run() {
for (int i = 0; i < 10;) {
System.out.println(getName() + "正在战场上厮杀 -> " + (i + 1));
if (isInterrupted()) {
System.out.println("我接收到撤退信号了, 撤");
break;
}
}
}