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

白話說(shuō)Java線程(二)—讓線程優(yōu)雅的停下來(lái)

開發(fā) 開發(fā)工具 后端
當(dāng)開啟一起線程去執(zhí)行任務(wù)之后,如果需要被停止,意味著它將放棄當(dāng)前正在進(jìn)行的操作。而在 Java 中,停止一個(gè)線程并不像 return 一個(gè)方法一樣干脆利落,想要安全的停止線程,需要一些跟優(yōu)雅的技巧。

[[210879]]

一、前言

繼續(xù)接之前 Java 多線程的內(nèi)容,之前講解了 Java 下多線程的使用,有興趣的可以先看看《白話說(shuō) Java 線程(一)之讓線程先跑起來(lái)》。但是能舞的起來(lái)是徒弟,能停的優(yōu)雅才是師傅。

接下來(lái)讓我們看看,如何優(yōu)雅的停止一個(gè)線程。

二、全的停止線程

2.1、安全停止涉及到的方法

當(dāng)開啟一起線程去執(zhí)行任務(wù)之后,如果需要被停止,意味著它將放棄當(dāng)前正在進(jìn)行的操作。而在 Java 中,停止一個(gè)線程并不像 return 一個(gè)方法一樣干脆利落,想要安全的停止線程,需要一些跟優(yōu)雅的技巧。

如果想要安全的停止一個(gè)線程,需要借助 Thread.interrupt() 方法,它的本意是停止、終止的意思,但是實(shí)際上,它并不會(huì)直接終止掉一個(gè)正在運(yùn)行的進(jìn)程,而是在當(dāng)前線程中,打一個(gè)需要"被停止"的標(biāo)簽,而是否停止應(yīng)該由當(dāng)前線程自己決定,所以這也決定了我們需要在編寫 Thread 或者 Runnable 代碼的時(shí)候,有更高的要求,要明確自己如何被安全的停止。

interrupt() 的解釋確實(shí)挺多,接下來(lái)看看它是如何使用的。

既然 interrupt() 只是為我們對(duì)當(dāng)前線程做了一個(gè)簡(jiǎn)單的停止標(biāo)記,而 JDK 同時(shí)也為我們提供了獲取這個(gè)標(biāo)記值的 API。

  • Thread.interrupted():檢查當(dāng)前運(yùn)行這段代碼的線程,是否已經(jīng)被停止。
  • this.isInterrupted():檢查當(dāng)前 this 指定的線程,是否已經(jīng)被停止。

通過(guò)源碼可以看到它們的區(qū)別,interrupted() 是一個(gè) static 的方法,并且操作的是當(dāng)前代碼運(yùn)行的當(dāng)前線程,而 isInterrupted() 方法缺失操作的是指定線程。它們最終都會(huì)調(diào)用 isInterrupted(boolean) 的方法。

再來(lái)看看這個(gè)方法。

可以看到,這個(gè)方法是一個(gè) native 的方法,參數(shù)表示是否需要清理這個(gè) Interrupted 的狀態(tài)。

2.2、具體看看這些方法的用處

舉個(gè)例子看看如何區(qū)分這兩個(gè)方法:

1 為停止,表示檢查的是 mt 這個(gè)線程,而 2 為沒(méi)停止,是因?yàn)闄z查的是當(dāng)前運(yùn)行環(huán)境的線程,即為主線程。

這個(gè)例子本身沒(méi)問(wèn)題,也講清楚了原本的意思。但是實(shí)際上,interrupt() 方法和 interrupted() 方法并不是線程安全的,也就是說(shuō),如果使用 interrupt() 方法停止了一個(gè)線程,立即使用 interrupted() 方法去檢查,可能會(huì)回去到還沒(méi)有被停止的結(jié)果。

前面介紹到,interrupt() 和 isInterrupted() 方法最終都會(huì)調(diào)用一個(gè) native 的 isInterrupted(boolean) 的方法,這個(gè)方法的參數(shù)主要是為了確定是否需要清理 interrupted 的狀態(tài)。

下面舉兩個(gè)例子就清楚了。

先看看 Thread.interrupted()。

可以看到,***次標(biāo)記為 true,但是獲取完之后,立即就被清理掉了 interrupt 狀態(tài),再去獲取,就標(biāo)記為 false。再看看 isInterrupted() ,它是不會(huì)清理掉狀態(tài)的。

2.3、需要安全停止的線程

那么繼續(xù)改造一下上面的例子,如果想在線程被停止之后,立即停止掉循環(huán),就可以在循環(huán)中,每次調(diào)用都檢查一下當(dāng)前線程是否已經(jīng)被停止了。如果被停止了,直接 return 出去,或者做一些清理工作再退出。

2.4、在sleep的時(shí)候,停止線程會(huì)發(fā)生什么

當(dāng)前線程有可能在運(yùn)行狀態(tài),也可能在 sleep 的狀態(tài),如果在 sleep 的狀態(tài)下,interrupt 一個(gè)線程,會(huì)發(fā)生什么?

從調(diào)用 sleep 的時(shí)候就應(yīng)該發(fā)現(xiàn),它是會(huì)拋出一個(gè) InterruptedException 異常的,這里就是專門為了捕捉在 sleep 的時(shí)候,被 interrupt 的情況。如果觸發(fā),將進(jìn)入 catch。并且置換 interrupt 狀態(tài)為 false ,所以這里觸發(fā)了到 sleep 的 catch 的時(shí)候,一定要有后續(xù)的操作,不要再依賴那兩個(gè)判斷線程終止的方法來(lái)判斷了。

三、如何非安全的停止線程

既然推薦用安全的方式來(lái)停止線程,那么不安全的方式又需要怎么做呢?不安全的方式其實(shí)本身也不推薦使用,但是研究一下為什么不安全也有利于我們理解線程安全。

不安全的方式,就涉及到 Thread 的幾個(gè)已經(jīng)被標(biāo)記為 @Deprecated 的方法,就是說(shuō),已經(jīng)被廢棄了,可能引發(fā)不可預(yù)料的問(wèn)題,不推薦使用。

這個(gè)方法就是 stop() 方法,和名稱一樣,它的作用就是停止線程。

stop() 能不能做到立即停止線程?

能,除了它的一些不可能預(yù)料的數(shù)據(jù)問(wèn)題之外,stop() 方法真的非常的好用,停止線程可以做到簡(jiǎn)單直接,直接被停止之后,后面的代碼根本不會(huì)得到執(zhí)行,這樣會(huì)導(dǎo)致一些清理工作沒(méi)法完成,并且 stop() 會(huì)直接釋放當(dāng)前獲取到的鎖,而如果當(dāng)前正好在修改加鎖的數(shù)據(jù)的時(shí)候,被強(qiáng)制停止了,就會(huì)導(dǎo)致數(shù)據(jù)被改了一半,導(dǎo)致數(shù)據(jù)不一致的情況。

既然不推薦使用,那就簡(jiǎn)單舉個(gè)例子,不再寫 demo 了。

假設(shè)一個(gè)人做生意,賣書,庫(kù)房里存了需要賣的書,每次的流程是從庫(kù)房里拿出來(lái)一本書,賣出去之后,把錢存入銀行賬戶,再去取一本書繼續(xù)賣。假設(shè)有一天,這個(gè)人從庫(kù)房取了一本書賣出去了,正在去銀行存錢的路上,被警察逮捕了(stop),接下來(lái)他就沒(méi)辦法完成去銀行存錢的任務(wù)了。這個(gè)時(shí)候?qū)膸?kù)存和銀行賬戶上的金額,就對(duì)不上了,因?yàn)槌鰩?kù)了一本書,缺沒(méi)有相應(yīng)的金錢入賬。這樣的一個(gè)數(shù)據(jù)不一致,就是線程不安全。當(dāng)然,實(shí)際項(xiàng)目中,這種數(shù)據(jù)操作都是以事務(wù)的形式存在的,一旦失敗就會(huì)回滾事務(wù),讓數(shù)據(jù)保持一致。

有一點(diǎn)需要注意一下,stop() 方法的時(shí)候,會(huì)觸發(fā) ThreadDead 異常,但是它不需要被顯示 Catch 住,大家只需要知道有這么個(gè)概念就可以了。

四、結(jié)語(yǔ)

到現(xiàn)在基本上就講解清楚了子線程的創(chuàng)建和停止。既然已經(jīng)被廢棄的方法,***還是不要去使用它,建議使用安全的方式去停止線程。

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-11-17 15:25:02

Java線程安全

2024-11-11 10:46:05

2025-06-24 08:25:00

Java并發(fā)編程線程

2023-05-12 14:14:00

Java線程中斷

2018-06-24 09:27:55

線程Tomcat多線程

2019-08-21 10:15:20

vue組件前端

2025-03-25 10:17:55

2023-12-20 10:04:45

線程池Java

2024-11-13 16:37:00

Java線程池

2025-04-15 08:20:32

Kotlinsuspend標(biāo)簽

2024-12-31 00:00:30

CursorAI編程

2013-06-08 13:07:23

Java線程池調(diào)度器

2024-08-06 09:43:54

Java 8工具編程

2024-04-23 09:35:27

線程終止C#多線程編程

2025-02-05 14:28:19

2009-06-11 10:48:53

Java多線程

2011-06-22 13:57:54

Java多線程

2013-07-16 10:57:34

iOS多線程多線程概念多線程入門

2024-09-26 10:51:51

2020-03-27 11:41:12

線程 Java中止
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91大片| 天天综合成人网 | 国产亚洲精品a | 日韩综合| 欧美又大粗又爽又黄大片视频 | 992tv人人草 久久精品超碰 | 国产小视频在线看 | 国产精品国产a级 | 天天看天天操 | 国产成人一区二区三区电影 | 国产女人与拘做受免费视频 | 在线中文av | 欧美日韩国产三级 | 成人在线一区二区三区 | 亚洲最大的黄色网址 | 亚洲成人午夜在线 | 国产精品日韩高清伦字幕搜索 | 天天天天操| 日韩手机视频 | 国产大片一区 | 国产在线二区 | 播放一级毛片 | 色桃网 | 国产高清在线观看 | 91精品国产综合久久婷婷香蕉 | 日韩欧美三级电影 | 久久久一区二区三区四区 | 欧美一区二区三区四区视频 | 国产亚洲精品久久久久动 | 91丨国产| 成人精品一区二区三区中文字幕 | 午夜看电影在线观看 | 欧美黑人一区 | 日韩精品一区二区三区在线播放 | 国产色在线 | 国产高清精品一区二区三区 | 久久99精品国产 | 精品欧美一区二区三区久久久 | 国产成人精品久久 | 91av久久久 | 日本不卡免费新一二三区 |