java线程暂停_Java之线程停止
public void run() {
while(true){
someWork();
if(finished){
break;
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我們可以在while死循環(huán)內(nèi),每次循環(huán)時,察看外部條件,看看是否需要關(guān)閉當前線程。如果是,就break,跳出死循環(huán),或者是拋出異常,跳出死循環(huán),結(jié)束線程。
有些執(zhí)行伺服任務(wù)的線程,在while(true)這樣的死循環(huán)內(nèi)部,是一個阻塞中的方法。此時,就不能采用第二種方法了。因為,當該方法沒有返回時,該線程一直處于阻塞當中,根本無法執(zhí)行其他語句。
此時,就需要調(diào)用該線程的interrupt方法,產(chǎn)生一個InterruptedException運行時異常,是阻塞中的那個方法拋出這個異常,從而讓我們有機會結(jié)束這個線程的執(zhí)行。
這里說一種特殊情況,有些情況可能你需要一下子停止整個系統(tǒng)的所有線程,這樣子上面的方法就不是那么高效,思路也差不多。例如下面的Thread1、Thread2。
public class Thread1 extends Thread {
@Override
public void run() {
while(true) {
try {
doSomeWork();
if (finished) {
break;
}
//wait for some resource
} catch (InterruptedException e) {
// ...
break;
}
}
}
}
public class Thread2 extends Thread {
@Override
public void run() {
while(true) {
try {
doSomeWork();
if (finished) {
break;
}
//wait for some resource
} catch (InterruptedException e) {
// ...
break;
}
}
}
}
顯然,通過上面那兩種方法不能一下子停止這些線程,因為我們不能做到這些線程能同時滿足條件,此外這些線程也不可能一塊堵塞。這里我們通過改變whlie條件來解決這個問題,在我們的Thread1、Thread2上面增加一個父類AbstractThread,例:
public abstract class AbstractThread extends Thread {
protected AtomicBoolean isRunning = new AtomicBoolean(true);
public void stopRunning() {
isRunning.set(false);
}
}
然后使Thread1、Thread2繼承AbstractThread,然后修改while循環(huán)為如下:
while(isRunning) {
...
}
在停止線程時,調(diào)用每個線程的stopRunning方法,如果存在堵塞的情況,在輔助調(diào)用該線程的interrupt方法。
分享到:
2009-08-16 22:54
瀏覽 15495
評論
4 樓
Nabulio
2016-08-16
?
3 樓
像胡楊樹一樣活著
2013-05-03
貌似我的水平很低,
沒懂。
2 樓
gauzeehom
2010-08-11
看過了
1 樓
zouxiyao
2010-07-08
很有用的東西
總結(jié)
以上是生活随笔為你收集整理的java线程暂停_Java之线程停止的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360隔离mysql恢复_MySQL备份
- 下一篇: java美元兑换,(Java实现) 美元