您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)怎么停止Java正在運(yùn)行的線程任務(wù)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
interrupted(): 測(cè)試當(dāng)前線程是否已經(jīng)中斷。該方法為靜態(tài)方法,調(diào)用后會(huì)返回boolean值。不過調(diào)用之后會(huì)改變線程的狀態(tài),如果是中斷狀態(tài)調(diào)用的,調(diào)用之后會(huì)清除線程的中斷狀態(tài)。
isInterrupted(): 測(cè)試線程是否已經(jīng)中斷。該方法由對(duì)象調(diào)用
interrupt(): 標(biāo)記線程為中斷狀態(tài),不過不會(huì)中斷正在運(yùn)行的線程。
stop(): 暴力停止線程。已棄用。
線程調(diào)用interrupt()方法后,在線程的run方法中判斷當(dāng)前對(duì)象的interrupted()狀態(tài),如果是中斷狀態(tài)則拋出異常,達(dá)到中斷線程的效果。
如下示例:
MyThread.java
public class MyThread extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 500000; i++) {
if (MyThread.interrupted()){
System.out.println("已經(jīng)是停止?fàn)顟B(tài)了,我要退出了!");
throw new InterruptedException();
}
System.out.println("i = " + (i+1));
}
System.out.println("如果我被輸出了,則代表線程沒有停止");
} catch (InterruptedException e) {
System.out.println("在MyThread類中的run方法中被捕獲");
e.printStackTrace();
}
}
}
Main.java
/**
* 根據(jù)中斷狀態(tài)退出for循環(huán)
* @Author: xjf
* @Date: 2019/5/25 13:27
*/
public class Main {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(100);
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end!");
}
}
結(jié)果如下:
i = 19115
i = 19116
i = 19117
i = 19118
i = 19119
end!已經(jīng)是停止?fàn)顟B(tài)了,我要退出了!
在MyThread類中的run方法中被捕獲
java.lang.InterruptedException
at com.book.interrupt_exit.MyThread.run(MyThread.java:15)Process finished with exit code 0
先將線程sleep,然后調(diào)用interrupt標(biāo)記中斷狀態(tài),interrupt會(huì)將阻塞狀態(tài)的線程中斷。會(huì)拋出中斷異常,達(dá)到停止線程的效果。如下示例:
MyThread.java
public class MyThread extends Thread {
@Override
public void run() {
try {
System.out.println("run-----------start");
Thread.sleep(5000);
System.out.println("run-----------end");
} catch (InterruptedException e) {
System.out.println("在沉睡中被停止!進(jìn)入catch,線程的是否處于停止?fàn)顟B(tài):" + this.isInterrupted());
e.printStackTrace();
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(2000);
System.out.println("狀態(tài):"+MyThread.interrupted());
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結(jié)果
run-----------start
狀態(tài):false
java.lang.InterruptedException: sleep interrupted
在沉睡中被停止!進(jìn)入catch,線程的是否處于停止?fàn)顟B(tài):false
at java.lang.Thread.sleep(Native Method)
at com.book.sleep_interrupt.MyThread.run(MyThread.java:13)
線程先調(diào)用interrupt標(biāo)記中斷狀態(tài),然后線程再睡眠。會(huì)拋出中斷異常,達(dá)到停止線程的效果。如下:
MyThread1.java
public class MyThread1 extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
System.out.println("i = " + (i+1));
}
System.out.println("run begin");
//interrupt是做一個(gè)中斷標(biāo)記,當(dāng)時(shí)不會(huì)去中斷正在運(yùn)行的線程,當(dāng)該線程處于阻塞狀態(tài)時(shí)就會(huì)進(jìn)行中斷
//因此,先進(jìn)行interrupt后,再遇到sleep阻塞時(shí),才會(huì)進(jìn)行中斷
Thread.sleep(200000);
System.out.println("run end");
} catch (InterruptedException e) {
System.out.println("先停止,再遇到了sleep! 進(jìn)入catch!");
e.printStackTrace();
}
}
}
Main1.java
public class Main1 {
public static void main(String[] args) {
MyThread1 myThread1 = new MyThread1();
myThread1.start();
myThread1.interrupt();
System.out.println("end!");
}
}
結(jié)果:
i = 99993
i = 99994
i = 99995
i = 99996
i = 99997
i = 99998
i = 99999
i = 100000
run begin先停止,再遇到了sleep! 進(jìn)入catch!
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.book.sleep_interrupt.MyThread1.run(MyThread1.java:19)
線程調(diào)用stop()方法會(huì)被暴力停止,方法已棄用。該方法會(huì)有不好的后果:
強(qiáng)制讓線程停止有可能使一些請(qǐng)理性的工作得不到完成。
對(duì)鎖定的對(duì)象進(jìn)行了“解鎖”,導(dǎo)致數(shù)據(jù)得不到同步的處理,出現(xiàn)數(shù)據(jù)不一致的問題(比如一個(gè)方法加上了synchronized,并在其中進(jìn)行了一個(gè)長時(shí)間的處理,而在處理結(jié)束之前該線程進(jìn)行了stop(),則未完成的數(shù)據(jù)將沒有進(jìn)行到同步的處理)
調(diào)用interrupt標(biāo)記為中斷狀態(tài)后,在run方法中判斷當(dāng)前線程狀態(tài),如果為中斷狀態(tài)則return,能達(dá)到停止線程的效果。
備注:建議使用“拋異?!钡姆椒▉韺?shí)現(xiàn)線程的停止,因?yàn)樵赾atch塊中還可以將異常向上拋,使線程停止的事件得以傳播
感謝各位的閱讀!關(guān)于“怎么停止Java正在運(yùn)行的線程任務(wù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。