當前位置:首頁 » 編程語言 » java讓線程停止

java讓線程停止

發布時間: 2025-07-23 11:15:56

java中終止線程的方法

在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(),stop(),stop(Throwable)andsuspend(),destroy()andresume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。本文是海文國際小編搜索整理的關於JAVA中終止線程的方法,供參考復習,希望對大家有所幫助!



如果真的需要終止一個線程,可以使用以下幾種方法:


1、讓線程的run()方法執行完,線程自然結束。(這種方法最好)


2、通過輪詢和共享標志位的方法來結束線程,例如while(flag){},flag的初始值設為真,當需要結束時,java課程培訓機構建議將flag的值設為false。(這種方法也不很好,因為如果while(flag){}方法阻塞了,則flag會失效)


② 求教高手:java中如何暫停一個線程中的任務,在以後的可以恢復之前任務的執行。

可以用以下幾種方法:
interrupt():中斷線程

stop():強迫線程停止執行。用 Thread.stop 來終止線程將釋放它已經鎖定的所有監視器(作為沿堆棧向上傳播的未檢查 ThreadDeath 異常的一個自然後果)。如果以前受這些監視器保護的任何對象都處於一種不一致的狀態,則損壞的對象將對其他線程可見,這有可能導致任意的行為。

yield()只是使當前線程重新回到可執行狀態,所以執行yield()的線程有可能在進入到可執行狀態後馬上又被執行。yield()只能使同優先順序的線程有執行的機會。----這句是重點

3.書上說yelid()是禮讓,是讓當前執行線程停下來給別的線程資源, 又說沒有任何機制保證會這樣。----------沒有任何機制保證執行yield()的線程一定會把資源讓給其它線程。打個比方:兩個人搶東西,A搶到了B沒有,再把東西放回去重搶,說不定還是A搶到B沒有。沒有任何機制保證放回去後B一定能搶到

sleep方法使線程睡眠,但是到一定毫秒數時會自動到cpu中等待
wait方法使線程等待,但是不會自動到cpu中等待,要通過notify或者notifyall方法進行喚醒。

以上是讓線程等待的方法,你可以選擇適合你程序的方法。

③ Java線程停止的方法,及stop等方法為什麼被廢棄

在 Java 中有以下 3 種方法可以終止正在運行的線程:

停止一個線程的推薦做法是修改某些變數以指示目標線程應停止運行。 目標線程應定期檢查此變數,如果該變數指示要停止運行,則應有序地從其運行方法返回。 這是為了確保對 stop-request 進行及時的通信,變數必須是 volatile 或者必須同步訪問變數。

使用 stop 方法終止線程存在本質上的不安全性。停止線程會使它解鎖它已鎖定的所有監視器,當 ThreadDeath 異常在堆棧中向上傳播時,監視器將被解鎖。如果先前由這些監視器保護的任何對象處於不一致狀態,則其他線程現在可能會以不一致狀態查看這些對象,這些對象被稱為已損壞的對象。當線程對損壞的對象進行操作時,可能會導致任意行為。與未檢查的異常不同,ThreadDeath 會無聲地殺死線程,用戶沒有警告其程序可能已損壞,在實際損壞發生後的任何時間,腐敗會體現出來。

為什麼 Thread.stop 被廢棄? 因為它本質上是不安全的。停止線程會使它解鎖它已鎖定的所有監視器,這可能導致其他線程以不一致狀態查看對象。當線程對損壞的對象進行操作時,可能會導致任意行為。ThreadDeath 異常會無聲地殺死線程,用戶沒有警告其程序可能已損壞,這使得編寫正確的多線程代碼的任務大大復雜化。

停止等待較長時間的線程(例如,等待輸入)可以通過使用 Thread.interrupt 方法來實現。可以使用上面展示的基於狀態的信令機制,當狀態更改之後可以調用 Thread.interrupt 來中斷等待。為了使該技術起作用,至關重要的是,任何捕獲中斷異常並且不準備處理中斷異常的方法都必須立即重新聲明該異常。

如果線程不響應 Thread.interrupt,那麼確實沒有什麼技術能奏效。在這種情況下,應該注意的是,在所有等待線程不響應 Thread.interrupt 的情況下,它也不響應 Thread.stop。這種情況下包括故意的拒絕服務攻擊,以及 Thread.stop 和 Thread.interrupt 無法正常工作的 I/O 操作。

為什麼不贊成使用 Thread.suspend 和 Thread.resume? Thread.suspend 本質上容易死鎖。 如果目標線程在掛起時,在監視器上持有一個保護關鍵系統資源的鎖,則在恢復目標線程之前,沒有線程可以訪問該資源。如果將恢復目標線程的線程在調用 resume 之前嘗試鎖定此監視器,則會導致死鎖。 這種僵局通常表現為「凍結」進程。

應該使用什麼代替 Thread.suspend 和 Thread.resume? 謹慎的方法是讓「目標線程」輪詢一個指示線程所需狀態(活動或掛起)的變數。當所需的狀態被掛起時,線程使用 Object.wait 等待。恢復線程後,將使用 Object.notify 通知目標線程。

可以結合兩種技術來產生可以安全地「停止」或「暫停」的線程。一個微妙之處是目標線程可能在另一個線程試圖將其停止時已被掛起。如果 stop 方法僅將狀態變數設置為 null,則目標線程將保持掛起狀態(在監視器上等待),而不是正常的退出。如果重新啟動了 applet,則多個線程可能最終會同時在監視器上等待,從而導致行為不穩定。要糾正這種情況,stop 方法必須確保目標線程在掛起後立即恢復。目標線程恢復後,必須立即識別出它已停止,並正常退出。

關於 Thread.destroy 方法,Thread.destroy 從未真正被實現。如果實現了它,使用 Thread.suspend 容易發生死鎖。實際上,它與 Thread.suspend 大致等效,沒有後續的 Thread.resume 的可能性。我們目前不實現它,但也不會棄用它(將來將阻止其實現)。盡管肯定會發生死鎖,但有人認為,在某些情況下,某個程序願意冒著 deadlock 的風險也不想直接退出。

熱點內容
壓縮版面格式 發布:2025-07-23 18:14:41 瀏覽:184
轟炸博客源碼 發布:2025-07-23 18:10:41 瀏覽:632
java解答 發布:2025-07-23 18:10:01 瀏覽:577
android圖片裁剪上傳圖片 發布:2025-07-23 18:09:11 瀏覽:240
r解壓文件 發布:2025-07-23 18:01:01 瀏覽:503
安溪哪裡有賣禮金密碼箱 發布:2025-07-23 17:32:36 瀏覽:528
同等配置藍鳥同軒逸哪個好 發布:2025-07-23 17:31:27 瀏覽:545
雲伺服器圖片載入速度慢 發布:2025-07-23 17:08:16 瀏覽:171
網址導航源碼帶後台 發布:2025-07-23 17:01:40 瀏覽:599
石粉過磅演算法 發布:2025-07-23 16:53:05 瀏覽:78