中斷一個(gè)正在運(yùn)行的線程
- 中斷阻塞線程的方法
@Override
public void run() {
try {
while (true) {
// 執(zhí)行任務(wù)...
}
} catch (InterruptedException ie) {
// 由于產(chǎn)生InterruptedException異常,退出while(true)循環(huán),線程終止!
}
}
我們調(diào)用線程對(duì)象的interrupt()方法時(shí)會(huì)產(chǎn)生InterruptedException中斷。中斷的捕獲在while(true)之外,這樣就退出了while(true)循環(huán)!
2.終止處于運(yùn)行狀態(tài)的線程
@Override
public void run() {
while (!isInterrupted()) {
// 執(zhí)行任務(wù)...
}
}
isInterrupted()是判斷線程的中斷標(biāo)記是不是為true。當(dāng)線程處于運(yùn)行狀態(tài),并且我們需要終止它時(shí);可以調(diào)用線程的interrupt()方法,使用線程的中斷標(biāo)記為true,即isInterrupted()會(huì)返回true。此時(shí),就會(huì)退出while循環(huán)。
3.通過(guò)標(biāo)志位中斷線程
private volatile boolean flag= true;
protected void stopTask() {
flag = false;
}
@Override
public void run() {
while (flag) {
// 執(zhí)行任務(wù)...
}
}
通過(guò)volatile變量保證內(nèi)存的可見(jiàn)性,從而保證多線程設(shè)置標(biāo)志位終止線程
線程的join()方法
public class JoinTest implements Runnable{
public static int a = 0;
public void run() {
for (int k = 0; k < 5; k++) {
a = a + 1;
}
}
public static void main(String[] args) throws Exception {
Runnable r = new JoinTest();
Thread t = new Thread(r);
t.start();
System.out.println(a);
}
}
正常情況下,打印出來(lái)a的值不確定,因?yàn)橹骶€程啟動(dòng)t之后繼續(xù)往下走,執(zhí)行打印語(yǔ)句,此時(shí)子線程執(zhí)行到哪一步還不確定,所以a的值不能確定,如果我想在執(zhí)行完子線程之后再打印怎么實(shí)現(xiàn)呢,如下:
public static void main(String[] args) throws Exception {
Runnable r = new JoinTest();
Thread t = new Thread(r);
t.start();
t.join(); //加入join()
System.out.println(a);
}
改為如下代碼即可實(shí)現(xiàn)子線程執(zhí)行完在執(zhí)行打印語(yǔ)句,join()方法其實(shí)就是當(dāng)前線程等待調(diào)用join()方法的線程執(zhí)行完在繼續(xù)執(zhí)行當(dāng)前線程的代碼。