<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這個問題是一個高頻的面試題
而且在印象中是由stop方法執行或者終端中的kill殺死
但是這些方法直接簡單粗暴,很不安全,而且也不推廣
不使用stop的方法
之所以不安全不推廣是因為:
使用自定義的標誌位決定執行緒的執行情況
具體思路大致如下:設定一個 父執行緒 的狀態變數,以其影響其子執行緒即可
public class test extends Thread { //標識執行緒是否結束 public static boolean thread_stop = true; public void stopThread() { thread_stop = false; } public static void main(String[] args) { test t = new test(); t.start(); System.out.println("Father Thread Start"); try { //先讓執行緒跑起來 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //結束執行緒 //將其狀態變數直接改為false //thread_stop = false; //呼叫方法改為false(與狀態變數直接修改 一個道理) t.stopThread(); System.out.println("Father Thread end"); } @Override public void run() { while (thread_stop) { System.out.println("Child Thread Start"); } System.out.println("Child Thread end"); } }
但是網上說不加volatile是停不下來的,其實是可以停下來的
只不過
加了volatile有幾個好處:
具體加在狀態變數中的位置如下:
//標識執行緒是否結束 public static volatile boolean thread_stop = true;
之後具體完整的輸出為:
具體完整的輸出為:
Father Thread start
Child Thread Start
Child Thread Start
。。。
。。。
Child Thread Start
Child Thread Start
Father Thread end
Child Thread end
不能終止一個正在執行著的執行緒,它只是修改中斷標誌而已
這個方法分為兩種情況:
執行緒處於阻塞:立馬退出阻塞,丟擲InterruptedException異常。通過捕獲這個異常,來讓執行緒退出
執行緒處於非阻塞:處於執行狀態不受影響,僅僅標記了執行緒的中斷為true。在適當的位置中呼叫isInterrupted方法檢視是否被中斷並且退出
public class test extends Thread { public static void main(String[] args) { test t = new test(); t.start(); System.out.println("Father Thread Start"); try { //先讓執行緒跑起來 Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //結束執行緒 t.interrupt(); System.out.println("Father Thread end"); } @Override public void run() { //分配執行緒的中斷狀態,並且此狀態可以由interrupted()方法生成 while (!Thread.interrupted()) { System.out.println("Child Thread Start"); } System.out.println("Child Thread end"); } }
執行結果截圖:
具體完整的輸出為:
Father Thread start
Child Thread Start
Child Thread Start
。。。
。。。
Child Thread Start
Child Thread Start
Father Thread end
Child Thread end
優雅的關閉執行緒池:(比如ThreadPoolExecutor類)
可以通過shutdown方法逐步關閉池中的執行緒(溫和安全)
shutdown():拒收新任務,不會立即終止執行緒池。而是要等所有任務快取佇列中的任務都執行完後才終止。
shutdownNow():拒收新任務,立即終止執行緒池。並嘗試打斷正在執行的任務。
並且清空任務快取佇列,返回尚未執行的任務
以下是對兩個執行緒池關閉的方法原始碼進行分析
而且關閉的途中,這兩個方法也不是瞬間立馬關閉,等待關閉的同時,還還呼叫awaitTermination方法來阻塞等待
檢視java的原始碼
在try內部結構中
1.檢查其狀態
2.原子性的修改執行緒池的狀態為stop
3.遍歷工作佇列執行緒,呼叫interrupt方法
4.將佇列中還未執行的放到任務佇列
原始碼內部:其邏輯就是修改執行緒池狀態為stop,工作佇列中呼叫interrupt方法
在呼叫shutdownNow方法:
同樣也是看java的原始碼
同樣也是4步狀態
1.檢查其狀態
2.修改執行緒池狀態為SHUTDOWN
3.呼叫interruptIdleWorkers方法中斷空閒執行緒(只有加鎖成功的執行緒才會被呼叫interrupt方法)
而正在執行的執行緒是加鎖失敗,不會被中斷
主要通過這個函數去區分判斷
以上就是詳解Java如何關閉執行緒以及執行緒池的詳細內容,更多關於Java關閉執行緒 執行緒池的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45