成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

擼一擼如何優雅地中止線程?

開發 后端
本文來學習如何學習優雅地中止線程?通過 Java 線程的生老病死的學習,我相信大家對線程的運行以及線程的狀態有一定了解了,那么我們現在來學習中止線程:

 [[320148]]

本文來學習如何學習優雅地中止線程?通過 Java 線程的生老病死的學習,我相信大家對線程的運行以及線程的狀態有一定了解了,那么我們現在來學習中止線程:

錯誤的線程中止 - stop

首先來講解一個錯誤的方式來中止線程 — stop:中止線程,并且清除監控器鎖的信息,但是可能導致線程安全問題,JDK 不建議使用,類似的方法還有 destory,由于 JDK 從未實現該方法,在這里就不介紹了。

接下來通過一段程序來講解為什么 stop 會導致線程安全問題?

首先定義一個線程類 StopThread: 

  1. public class StopThread extends Thread { 
  2.     private int i = 0; 
  3.     private int j = 0; 
  4.  
  5.     @Override 
  6.     public void run() { 
  7.         synchronized (this) { 
  8.             // 增加同步鎖,確保線程安全 
  9.             ++i; 
  10.             try { 
  11.                 // 休眠10秒,模擬耗時操作 
  12.                 Thread.sleep(10000); 
  13.             } catch (InterruptedException e) { 
  14.                 e.printStackTrace(); 
  15.             } 
  16.             ++j; 
  17.         } 
  18.     } 
  19.  
  20.     /** 
  21.      * 打印 i 和 j 
  22.      */ 
  23.     public void print() { 
  24.         System.out.println("i=" + i + " j=" + j); 
  25.     } 

這個線程做的事情就是在同步代碼塊中對 i 和 j 這兩個變量進行自增操作,但是在這個執行過程中會進行 10 秒的睡眠,如果在這個過程中,如果用 stop 方法將線程中止的話,會導致 i 和 j 數據不正確,也可以說程序設計上的線程安全問題,因為主線程影響到了創建的 StopThread 線程的數據不正確性,理想的正確輸出結果應該是要么全部添加成功,要么都失敗,因為我們添加鎖的目的就是保證操作原子性或者說想讓這兩個變量在操作的時候不受其他線程干擾。

下面編寫 StopThreadDemo 類,來使用 stop 方法做個錯誤示范: 

  1. public class StopThreadDemo { 
  2.     public static void main(String[] args) throws InterruptedException { 
  3.         StopThread thread = new StopThread(); 
  4.         thread.start(); 
  5.         // 休眠 1 秒,確保 i 變量自增成功 
  6.         Thread.sleep(1000); 
  7.         // 暫停線程 
  8.         thread.stop(); // 錯誤的終止 
  9.         while (thread.isAlive()) { 
  10.             // 確保線程已經終止 
  11.         } // 輸出結果 
  12.         thread.print(); 
  13.     } 

在 StopThreadDemo 類中,創建并啟動了 StopThread 線程,這個線程就是下執行變量i 和 j 的自增操作,但是這個自增操作是用同步關鍵字包裹的同步代碼塊,這樣做是為了讓兩個變量的自增操作實現原子性,不會受到其他線程的干擾,確保線程的安全。

但是在線程休眠的 10 秒內,通過 stop 方法把線程中止掉,會發現輸出結果為 i=1 j=0,也就是代碼的前半段 i 自增實現,但是后半段 j 的自增失敗,會使線程中的數據出現不一致性,從而同步代碼塊的保證的原子性的目標沒有達成,破壞了線程安全。

正確的線程中止 - interrupt

在介紹了錯誤的中止方式后,讓我們來學習正確的線程中止 - interrupt :

如果目標線程在調用 Object class 的 wait() 、wait(long) 或 wait(long,int) 方法、join()、join(long,int) 或 sleep(long,int) 方法時阻塞,那么 interrupt 會生效,該線程的中斷狀態將被清除,拋出 InterruptedException 異常。

如果目標線程是被 IO 或者 NIO 中的 Channel 所阻塞,同樣 IO 操作會被中斷返回特殊異常值,達到中止線程的目的。

如果以上條件都不滿足,則會設置此線程的中斷狀態。

接下來將 StopThreadDemo 中的 stop 改為 interrupt 來看下運行結果是什么: 

  1. java.lang.InterruptedException: sleep interrupted 
  2.   at java.lang.Thread.sleep(Native Method) 
  3.   at com.wupx.thread.StopThread.run(StopThread.java:18) 
  4. i=1 j=1 

可以發現兩個變量的自增可以正常執行,保證了執行的數據一致性,interrupt 不會強制中止,將線程直接中斷,而是拋出異常通知我們,開發者就可以控制收到異常后的執行邏輯,讓整個程序處于線程安全的狀態,這是目前 JDK 版本中推薦的 interrupt 方法。

除了 interrupt 的正確方法外,還可以通過標志位的形式來中止線程:

正確的線程中止 - 標志位如果代碼程序邏輯中是循環執行的業務,可以在程序的執行中線程代碼中增加一個標志位,比如下面代碼中在 while 循環中去執行這個程序,通過 flag 去控制程序是否繼續執行,如果在外部線程將 flag 修改為 false,那么創建的子線程代碼中會收到這個數據的變化,通過這個變量的形式,通知到另一個線程,從而達到控制線程中止的效果。 

  1. java.lang.InterruptedException: sleep interrupted 
  2.   at java.lang.Thread.sleep(Native Method) 
  3.   at com.wupx.thread.StopThread.run(StopThread.java:18) 
  4. i=1 j=1 

通過運行代碼,得到的結果如下: 

  1. 運行中 
  2. 運行中 
  3. 運行中 
  4. 程序運行結束 

這種方式受限于線程中所執行的業務邏輯,如果程序中是有可以用來做標志位的條件的話可以用這種方式來做,也是一種正確的線程中止方式。

總結

本文主要學習了線程中止的三種方式:stop、interrupt 以及標志位,大家學會了嗎,歡迎留言討論。

 

責任編輯:武曉燕 來源: 武培軒
相關推薦

2025-06-24 08:25:00

Java并發編程線程

2020-11-12 07:51:05

DockerSpring Boot應用

2018-04-12 17:00:07

云計算燒烤SaaS

2022-09-28 12:23:36

Promise代碼

2021-10-27 06:49:34

線程池Core函數

2023-01-10 19:47:47

Redis原理多線程

2017-02-20 13:54:04

戴爾

2022-03-01 11:38:51

RPC框架后端

2021-10-12 09:24:02

Java線程池源碼

2015-06-12 10:01:25

程序員代碼

2017-07-14 14:12:10

AndroidRecyclerVie

2020-11-04 07:56:19

工具Linux 翻譯

2021-06-07 12:08:06

iOS Python API

2020-08-03 08:10:52

UDPTCP通信

2021-12-12 18:18:15

代碼元宇宙Python

2021-11-02 22:35:46

配置DubboLoadbalance

2024-02-19 00:00:00

Redis分布式

2021-05-14 13:30:17

Mybatis分表插件

2020-09-10 06:58:34

C語言DBProxy

2021-11-02 14:19:15

插件MavengroupId
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天艹 | 亚州精品天堂中文字幕 | 亚洲国产高清免费 | 国产乱码精品一区二区三区五月婷 | 国产精品视频不卡 | 国产精品毛片久久久久久久 | 日韩av一区二区在线观看 | 亚洲精品在线免费观看视频 | 超碰97在线免费 | 久久久久久国产精品 | 久久久久国产精品 | 日韩电影一区 | 成人免费福利视频 | 国产草草视频 | 国产综合精品一区二区三区 | 久久宗合色 | 亚洲成人一区二区三区 | 欧美成人第一页 | 伦理片97| 第一区在线观看免费国语入口 | 亚洲三级国产 | 欧美激情一区二区三区 | 日韩欧美亚洲 | 一区二区三区免费在线观看 | 成人妇女免费播放久久久 | 久久久www成人免费无遮挡大片 | 久久精品视频在线观看 | 97精品超碰一区二区三区 | 免费看啪啪网站 | 中文字幕一区在线观看视频 | 久久av网站 | 午夜影视免费片在线观看 | 一本色道久久综合亚洲精品高清 | 国产精品视频一区二区三区 | 中文字幕在线播放第一页 | 国产精品福利在线观看 | 亚洲免费高清 | 一级欧美| 91欧美激情一区二区三区成人 | 亚洲成人av在线播放 | 国产精品成人69xxx免费视频 |