1. 程式人生 > >JAVA多執行緒機制之暫停、恢復和停止

JAVA多執行緒機制之暫停、恢復和停止

在JDK1.2以前的版本如果要實現執行緒的暫停、恢復和停止的方法分別是suspend()、resume()、stop()。但是從JDK1.2以後這些方法已經被遺棄,因為它們有可能造成嚴重的系統錯誤和異常。
首先suspend()方法不會釋放執行緒所佔用的資源。如果使用該方法將某個執行緒掛起,則可能會使其他等待資源的執行緒死鎖。而resume()方法本身並無問題,但是不能獨立於suspend()方法存在。
其次呼叫stop()可能會導致嚴重的系統故障。因為該方法會使執行緒立刻中斷指令執行,不管這段方法是否執行完畢。如果這個執行緒正在做重要的操作,對程式的執行起著支撐作用,這時如果突然中斷其執行則會導致系統崩潰。
現在,這些方法已經不適合掛起和終止執行緒了,但是可以在run()方法中設定一些標誌,通過線上程內部檢測標誌判斷並呼叫wait()方法和notify()方法操作執行緒的掛起、恢復和正常終止。
下面通過示例來演示這些操作。

/**
 * 執行緒控制
 * 
 * @author jianggujin
 *
 */
public class ThreadCtrlDemo extends Thread
{
   private final int STOP = -1;
   private final int SUSPEND = 0;
   private final int RUNNING = 1;
   private int status = 1;
   private long count = 0;

   public ThreadCtrlDemo(String name)
   {
      super
(name); } @Override public synchronized void run() { // 判斷是否停止 while (status != STOP) { // 判斷是否掛起 if (status == SUSPEND) { try { // 若執行緒掛起則阻塞自己 wait(); } catch (InterruptedException e) { System.out.println("執行緒異常終止..."
); } } else { count++; System.out.println(this.getName() + "第" + count + "次執行..."); try { Thread.sleep(100); } catch (InterruptedException e) { System.out.println("執行緒異常終止..."); } } } } /** * 恢復 */ public synchronized void myResume() { // 修改狀態 status = RUNNING; // 喚醒 notifyAll(); } /** * 掛起 */ public void mySuspend() { // 修改狀態 status = SUSPEND; } /** * 停止 */ public void myStop() { // 修改狀態 status = STOP; } public static void main(String[] args) { ThreadCtrlDemo demo = new ThreadCtrlDemo("測試執行緒"); demo.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println("主執行緒異常終止..."); } System.out.println("測試執行緒即將被掛起..."); demo.mySuspend(); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("主執行緒異常終止..."); } System.out.println("測試執行緒即將被喚醒..."); demo.myResume(); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("主執行緒異常終止..."); } System.out.println("終止測試執行緒..."); demo.myStop(); System.out.println("主執行緒終止..."); } }

執行結果:
測試執行緒第1次執行…
測試執行緒第2次執行…
測試執行緒第3次執行…
測試執行緒第4次執行…
測試執行緒第5次執行…
測試執行緒第6次執行…
測試執行緒第7次執行…
測試執行緒第8次執行…
測試執行緒第9次執行…
測試執行緒第10次執行…
測試執行緒第11次執行…
測試執行緒第12次執行…
測試執行緒第13次執行…
測試執行緒第14次執行…
測試執行緒第15次執行…
測試執行緒第16次執行…
測試執行緒第17次執行…
測試執行緒第18次執行…
測試執行緒第19次執行…
測試執行緒第20次執行…
測試執行緒即將被掛起…
測試執行緒即將被喚醒…
測試執行緒第21次執行…
測試執行緒第22次執行…
測試執行緒第23次執行…
測試執行緒第24次執行…
測試執行緒第25次執行…
測試執行緒第26次執行…
測試執行緒第27次執行…
測試執行緒第28次執行…
測試執行緒第29次執行…
測試執行緒第30次執行…
終止測試執行緒…
測試執行緒第31次執行…
主執行緒終止…

相關推薦

JAVA執行機制暫停恢復停止

在JDK1.2以前的版本如果要實現執行緒的暫停、恢復和停止的方法分別是suspend()、resume()、stop()。但是從JDK1.2以後這些方法已經被遺棄,因為它們有可能造成嚴重的系統錯誤和異常。 首先suspend()方法不會釋放執行緒所佔用的資源。

Java執行學習waitnotify/notifyAll 詳解

轉載 https://www.cnblogs.com/moongeek/p/7631447.html 1、wait()、notify/notifyAll() 方法是Object的本地final方法,無法被重寫。 2、wait()使當前執行緒阻塞,前提是 必須先獲

Java執行基礎手撕生產者消費者模式

問題描述 資料結構: 生產者/消費者 快取區(共享資源) 規則: 生產/消費者同時操作快取區。 當快取區為空的時候,消費者不能消費,即消費者阻塞。 當快取區為滿的時候,生產者不能生產,即生產者阻

Java執行-併發sleep() wait(n) wait() 的區別

sleep() 和 wait(n) 、 wait() 的區別 答: sleep 方法:是 Thread 類的靜態方法,當前執行緒將睡眠 n 毫秒,執行緒進入阻塞狀態。當睡眠時間到了,會接觸阻塞,進入可執行狀態,等待 CPU 的到來。睡眠不釋放鎖(如果有的話) wai

Java執行學習執行執行池的使用

執行緒組 Java中使用ThreadGroup來表示執行緒組,可以對一批執行緒進行分類管理。 package thread; public class MyRunnable implements Runnable { @Override public void run() { fo

java執行程式設計使用Synchronized塊同步變數

通過synchronized塊來同步特定的靜態或非靜態方法。 要想實現這種需求必須為這些特性的方法定義一個類變數,然後將這些方法的程式碼用synchronized塊括起來,並將這個類變數作為引數傳入synchronized塊   下面的程式碼演示瞭如何同步特定的類方法:

JAVA執行問題死鎖】

  一、死鎖是什麼? 舉個例子:兩個人一起吃飯,每個人都拿了一隻筷子,雙方都在等待對方將筷子讓給自己,結果兩個人都吃不了飯。這種情況和計算機中的死鎖情況很相似。 假設有兩個執行緒,互相等待對方釋放佔有的鎖,但是釋放鎖的條件又不可能形成,這時候死鎖就形成了。 還是買票的問題,有的時候時會發生死

Java執行-併發執行

執行緒池有了解嗎? 答: java.util.concurrent.ThreadPoolExecutor 類就是一個執行緒池。客戶端呼叫ThreadPoolExecutor.submit(Runnable task) 提交任務,執行緒池內部維護的工作者執行緒的數量就是該執行緒池的執行

Java執行-併發synchronized 關鍵字

synchronized 關鍵字 答: 底層實現: 進入時,執行 monitorenter,將計數器 +1,釋放鎖 monitorexit 時,計數器 -1 當一個執行緒判斷到計數器為 0 時,則當前鎖空閒,可以佔用;反之,當前執行緒進入等待狀態 含義

Java執行-併發執行產生死鎖的4個必要條件?如何避免死鎖?

多執行緒產生死鎖的4個必要條件? 答: 互斥條件:一個資源每次只能被一個執行緒使用 請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放 不剝奪條件:程序已經獲得的資源,在未使用完之前,不能強行剝奪 迴圈等待條件:若干執行緒之間形成一種頭

Java執行-併發執行程序的區別

執行緒和程序的區別 答: 程序是一個“執行中的程式”,是系統進行資源分配和排程的一個獨立單位 執行緒是程序的一個實體,一個程序中擁有多個執行緒,執行緒之間共享地址空間和其他資源(所以通訊和同步等操作執行緒比程序更加容易) 執行緒上下文的切換比程序上下文切換要快

Java執行-併發如何制定執行執行順序?

文章目錄 如何讓10個執行緒按照順序列印0123456789? 程式碼如下: 1.建立一個鎖物件類 2.建立一個執行緒類 3.測試類 如何讓10個執行緒按照順序列印012

201711671223《Java程式設計》第十一週學習總結 第12章Java執行機制

201711671223《Java程式設計》第十一週學習總結 第12章Java多執行緒機制 作業系統與程序:程式是一段靜態的程式碼,它是應用軟體執行的藍本。程序是程式的一次動態執行過程,它對應了從程式碼載入、執行至執行完畢的一個完整過程,這個過程也是程序本身從產生、發展至消亡的過程。現代作業系統

#Java執行知識點總結waitnotifynotifyAll

Java多執行緒 設計一個典型的場景,來闡述wait()、notify()、notifyAll(),生產消費者。 有生產者、消費者、緩衝佇列(size=10)。 生產者不停地向緩衝佇列裡放資料,一旦佇列滿了,則wait(),並notify()消費者進行處理。 消費者不停地從緩衝佇列裡

java執行系列模式|第一篇-Guarded Suspension pattern

Guarded Suspension pattern模式 作者注:該系列文章基於《java執行緒設計模式》撰寫,只用於學習和交流。 定義:多執行緒執行,當前執行緒沒有達到警戒條件時,執行緒會進入等待直到

java執行系列模式|第三篇: Producer-Consumer pattern

生產者-消費者模式 含義:顧名思義,生產者用來生產資料,可能有一到多個,消費者用來消費資料,也可能有多個,中間會有一個“橋樑參與者”,作為資料的存放以及執行緒之間的同步和協調。 範例程式行為: 廚師(MakerThread)做蛋糕,做好後放在桌子(Table)上 桌子

(2.1.2.4)Java執行(四)執行

系統啟動一個新執行緒的成本是比較高的,因為它涉及到與作業系統的互動。在這種情況下,使用執行緒池可以很好的提供效能,尤其是當程式中需要建立大量生存期很短暫的執行緒時,更應該考慮使用執行緒池。 與資料庫連線池類似的是,執行緒池在系統啟動時即建立大量空閒的執行緒,程

JAVA執行機制第二彈:(程式碼)Thread的子類建立執行

在Java中,執行緒物件的建立是用Threa類或者它的子類建立。 在編寫Thread類的子類時,需要重寫父類的run()方法,其目的是規定執行緒的具體操作,否則執行緒就沒有開始的地方 在這裡,做一個小小總結:  ··線上程的編寫的時候,要重寫父類的run()方法,在ru

JAVA執行機制第四彈:(末篇)執行常用方法總結執行同步

執行緒的常用方法: 這裡我覺得這個老師的教案總結的很舒胡(主要是懶~):  執行緒同步: 在處理多執行緒問題時,有一個Bug問題啊:當兩個或多個執行緒同時訪問一個父類變數時,並且一個執行緒需要修改這個變數,(一個執行緒讓變數A增加,另一個執行緒讓變數A減少)。 所

Java執行基礎停止執行

JAVA中有3種終止正在執行的執行緒: 使用退出標誌,使執行緒正常的退出,也就是run方法執行完成後執行緒終止。 使用stop方式強行終止執行緒,但是不推薦使用這種方式,因為stop和suspend及resume一樣,都是作廢過期的方法,使用它們可能產生不可預料的後果。 使用i