詳解Java停止線程的四種方法
線程調(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('如果我被輸出了,則代表線程沒(méi)有停止');} 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 = 19115i = 19116i = 19117i = 19118i = 19119end!
已經(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
三、停止線程方法2:在沉睡中停止先將線程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):falsejava.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 = 99993i = 99994i = 99995i = 99996i = 99997i = 99998i = 99999i = 100000run 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)
四、停止線程方法3:stop()暴力停止線程調(diào)用stop()方法會(huì)被暴力停止,方法已棄用。該方法會(huì)有不好的后果:
強(qiáng)制讓線程停止有可能使一些請(qǐng)理性的工作得不到完成。 對(duì)鎖定的對(duì)象進(jìn)行了“解鎖”,導(dǎo)致數(shù)據(jù)得不到同步的處理,出現(xiàn)數(shù)據(jù)不一致的問(wèn)題(比如一個(gè)方法加上了synchronized,并在其中進(jìn)行了一個(gè)長(zhǎng)時(shí)間的處理,而在處理結(jié)束之前該線程進(jìn)行了stop(),則未完成的數(shù)據(jù)將沒(méi)有進(jìn)行到同步的處理) 五、停止線程方法4:使用return停止線程調(diào)用interrupt標(biāo)記為中斷狀態(tài)后,在run方法中判斷當(dāng)前線程狀態(tài),如果為中斷狀態(tài)則return,能達(dá)到停止線程的效果。
備注:建議使用“拋異常”的方法來(lái)實(shí)現(xiàn)線程的停止,因?yàn)樵赾atch塊中還可以將異常向上拋,使線程停止的事件得以傳播
參考:《Java多線程編程核心技術(shù)》
到此這篇關(guān)于詳解Java停止線程的四種方法的文章就介紹到這了,更多相關(guān)Java停止線程內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 簡(jiǎn)述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別2. Python TestSuite生成測(cè)試報(bào)告過(guò)程解析3. Java JTable 實(shí)現(xiàn)日歷的示例4. python excel和yaml文件的讀取封裝5. 深入了解JAVA 軟引用6. 利用php來(lái)自動(dòng)調(diào)用不同服務(wù)器上的flash7. springboot的yml配置文件通過(guò)db2的方式整合mysql的教程8. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法9. 解決AJAX返回狀態(tài)200沒(méi)有調(diào)用success的問(wèn)題10. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法
