不正確的線(xiàn)程終止 - stop() 方法
stop: 終止線(xiàn)程仔雷,并且清除監(jiān)視器鎖的信息,但是可能導(dǎo)致線(xiàn)程安全問(wèn)題葛碧,JDK不建議使用
destroy:JDK未實(shí)現(xiàn)該方法
api 示例
public class Demo {
public static void main(String [] args) {
Thread thread = new Thread(() -> {
System.out.print("hello world");
});
thread.stop();
}
}
正確的線(xiàn)程終止
1借杰、正確的線(xiàn)程終止 - interrupt() 方法
如果目標(biāo)線(xiàn)程在調(diào)用 Object class 的 wait()、wait(long) 或者 wait(long, int)方法进泼、join()蔗衡、join(long, int) 或 sleep(long, int) 方法時(shí)被阻塞纤虽,那么 interrupt 會(huì)生效,該線(xiàn)程的中斷狀態(tài)將被清除绞惦,拋出 InterruptedExecption 異常逼纸。
如果目標(biāo)線(xiàn)程是被 I/O 或者 NIO 中的 Channel 阻塞,同樣济蝉,I/O 操作會(huì)被中斷或者返回特殊異常值杰刽。達(dá)到終止線(xiàn)程的目的。
如果以上條件都不滿(mǎn)足王滤,則會(huì)設(shè)置此線(xiàn)程的中斷狀態(tài)贺嫂。
api 示例
public class Demo {
public static void main(String [] args) {
Thread thread = new Thread(() -> {
System.out.print("hello world");
});
thread.interrupt();
}
}
2、正確的線(xiàn)程終止 - 標(biāo)志位
代碼邏輯中雁乡,增加一個(gè)判斷涝婉,用來(lái)控制線(xiàn)程執(zhí)行的終止。
為了避免線(xiàn)程可見(jiàn)性問(wèn)題蔗怠,一般用 volatile 修飾標(biāo)志位成員變量墩弯,例如:
public class Demo extends Thread {
public volatile static boolean flag = true;
public static void main(String [] args) throws InterruptedException {
new Thread(() -> {
try{
while(flag) {
System.out.println("running...");
Thread.sleep(1000L);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
// 3秒后,將標(biāo)志位修改為false寞射,代表不在繼續(xù)運(yùn)行
Thread.sleep(3000L);
flag = false;
System.out.println("stop running");
}
}