中斷(Interrupt)一個線程意味著在該線程完成任務(wù)之前停止其正在進行的一切,有效地中止其當(dāng)前的操作。
成都創(chuàng)新互聯(lián)是一家專業(yè)提供公主嶺企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、網(wǎng)站制作、H5網(wǎng)站設(shè)計、小程序制作等業(yè)務(wù)。10年已為公主嶺眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進行中。
線程是死亡、還是等待新的任務(wù)或是繼續(xù)運行至下一步,就取決于這個程序。雖然初次看來它可能顯得簡單,但是,你必須進行一些預(yù)警以實現(xiàn)期望的結(jié)果。你最好還是牢記以下的告誡。
首先,忘掉Thread.stop方法。雖然它確實停止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的JAVA版本中,它將不復(fù)存在。
中斷線程最好的,最受推薦的方式是,使用共享變量(shared variable)發(fā)出信號,告訴線程必須停止正在運行的任務(wù)。線程必須周期性的核查這一變量(尤其在冗余操作期間),然后有秩序地中止任務(wù)。
在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(),stop(),stop(Throwable)andsuspend(),destroy()andresume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。本文是海文國際小編搜索整理的關(guān)于JAVA中終止線程的方法,供參考復(fù)習(xí),希望對大家有所幫助!
如果真的需要終止一個線程,可以使用以下幾種方法:
1、讓線程的run()方法執(zhí)行完,線程自然結(jié)束。(這種方法最好)
2、通過輪詢和共享標(biāo)志位的方法來結(jié)束線程,例如while(flag){},flag的初始值設(shè)為真,當(dāng)需要結(jié)束時,java課程培訓(xùn)機構(gòu)建議將flag的值設(shè)為false。(這種方法也不很好,因為如果while(flag){}方法阻塞了,則flag會失效)
stop()
已過時。
該方法具有固有的不安全性。用
Thread.stop
來終止線程將釋放它已經(jīng)鎖定的所有監(jiān)視器(作為沿堆棧向上傳播的未檢查
ThreadDeath
異常的一個自然后果)。如果以前受這些監(jiān)視器保護的任何對象都處于一種不一致的狀態(tài),則損壞的對象將對其他線程可見,這有可能導(dǎo)致任意的行為。stop
的許多使用都應(yīng)由只修改某些變量以指示目標(biāo)線程應(yīng)該停止運行的代碼來取代。目標(biāo)線程應(yīng)定期檢查該變量,并且如果該變量指示它要停止運行,則從其運行方法依次返回。如果目標(biāo)線程等待很長時間(例如基于一個條件變量),則應(yīng)使用
interrupt
方法來中斷該等待。有關(guān)更多信息,請參閱為何不贊成使用
Thread.stop、Thread.suspend
和
Thread.resume?。
JAVA
API中的描述是
Thread類的
JDK中提供了stop方法,但是現(xiàn)在已經(jīng)不建議使用了。這個方法會使線程突然停止,沒有經(jīng)過別的處理,所以在有的時候會造成臟讀。在一些情況下,需要采取其他方式來停止線程。
例:
public class test {
public static void main(String[] args) throws InterruptedException {
try{
Thread thread1=new Thread(new TheThread(),"thread1");
thread1.start();
Thread.sleep(2000);
thread1.interrupt();//采用異常停止線程
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
class TheThread extends Thread{
public void run() {
super.run();
for (int i = 0; i 10; i++) {
if(this.interrupted()){
break;
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}