Java 併發程式設計學習筆記 05 :如何暫停執行緒?
一、基礎用法
和終止執行緒不同,暫停執行緒意味著此執行緒還可以恢復,在 Java 中,可以使用 suspend() 方法暫停執行緒,然後使用 resume() 方法恢復執行緒的執行。
首先通過一個例子來了解一下這兩個方法的基礎用法,程式碼如下:
public class Run {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
System.out.println("執行緒開始執行");
myThread.start();
Thread.sleep(100);
System.out.println(myThread.getI());
System.out.println(myThread.getI());
System.out.println(myThread.getI());
System.out.println("執行緒暫停執行");
myThread.suspend();
Thread.sleep(100);
System.out.println(myThread.getI());
System.out.println(myThread.getI());
System.out.println(myThread.getI());
System.out.println("執行緒恢復執行");
myThread.resume();
Thread.sleep(100);
System.out.println(myThread.getI());
System.out.println(myThread.getI());
System.out.println(myThread.getI());
}
}
class MyThread extends Thread {
private long i = 0;
public long getI() {
return i;
}
public void setI(long i) {
this.i = i;
}
@Override
public void run() {
while (true) {
i++;
}
}
}
控制檯輸出如下:
執行緒開始執行
168569210
168612106
168619437
執行緒暫停執行
168657087
168657087
168657087
執行緒恢復執行
336960390
337119218
337155923
程式碼主要分為三部分,分別是開始、暫停和恢復,對應控制檯的輸出我們可以很清楚地看到:在開始和暫停之間的三次輸出是不同的,說明執行緒正在執行;在暫停和恢復之間的三次輸出是一樣的,說明執行緒已暫停;在恢復之後的三次輸出是不同的,說明執行緒已恢復執行。
二、缺點
使用這兩種方法進行執行緒的暫停與恢復很容易出現獨佔鎖和資料不完整的情況。下面我會對這兩種情況分別舉例說明。
2.1 獨佔鎖
public class Run {
public static void main(String[] args) throws InterruptedException {
SynchronizedObject synchronizedObject = new SynchronizedObject();
Thread t1 = new Thread() {
@Override
public void run() {
synchronizedObject.printString();
}
};
t1.setName("a");
t1.start();
Thread.sleep(1000);
Thread t2 = new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "確實開啟了執行緒");
synchronizedObject.printString();
System.out.println("但我是不會輸出的");
}
};
t2.setName("b");
t2.start();
}
}
class SynchronizedObject {
synchronized public void printString() {
System.out.println("-----start-----");
if ("a".equals(Thread.currentThread().getName())) {
System.out.println("執行緒 a 永遠暫停了!");
Thread.currentThread().suspend();
}
System.out.println("------end------");
}
}
控制檯輸出:
-----start-----
執行緒 a 永遠暫停了!
b確實開啟了執行緒
執行緒 a 先執行 printString() 方法,在輸出控制檯的前兩行後又執行了 suspend() 方法永久暫停了執行緒,並且沒有釋放物件鎖;然後執行緒 b 開始執行,等到執行 printString() 方法時因為無法獲取物件鎖而無法繼續執行。
2.2 資料不完整
public class Run {
public static void main(String[] args) throws InterruptedException {
MyObject myObject = new MyObject();
Thread thread = new Thread() {
@Override
public void run() {
myObject.setValue("zmy", "123");
}
};
thread.setName("a");
thread.start();
Thread.sleep(2000);
myObject.printString();
}
}
class MyObject {
private String username = "root";
private String password = "root";
public void setValue(String username, String password) {
this.username = username;
if ("a".equals(Thread.currentThread().getName())) {
System.out.println("暫停執行緒 a!");
Thread.currentThread().suspend();
}
this.password = password;
}
public void printString() {
System.out.println("username = " + this.username);
System.out.println("password = " + this.password);
}
}
控制檯輸出如下:
暫停執行緒 a!
username = zmy
password = root
相關文章
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- Java併發程式設計筆記6:執行緒池的使用Java程式設計筆記執行緒
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- Java併發程式設計:Java執行緒Java程式設計執行緒
- 程式設計體系結構(05):Java多執行緒併發程式設計Java執行緒
- 《java學習三》併發程式設計 -------執行緒池原理剖析Java程式設計執行緒
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.2 Java多執行緒實現Java筆記執行緒程式設計
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- Java併發程式設計:執行緒池ThreadPoolExecutorJava程式設計執行緒thread
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.5 Java併發框架ExecutorJava筆記執行緒程式設計框架
- java併發筆記之java執行緒模型Java筆記執行緒模型
- 《C#併發程式設計經典例項》學習筆記—2.1 暫停一段時間C#程式設計筆記
- 併發程式設計——如何終止執行緒程式設計執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- Java 併發程式設計 | 執行緒池詳解Java程式設計執行緒
- java併發程式設計:執行緒池的使用Java程式設計執行緒
- Java 多執行緒學習筆記Java執行緒筆記
- Java併發程式設計(二)如何保證執行緒同時/交替執行Java程式設計執行緒
- Java多執行緒程式設計筆記9:ReentrantReadWriteLockJava執行緒程式設計筆記
- 併發程式設計之:執行緒程式設計執行緒
- Linux程式執行緒學習筆記Linux執行緒筆記
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- Java併發程式設計之執行緒篇之執行緒簡介(二)Java程式設計執行緒
- Java多執行緒學習(七)併發程式設計中一些問題Java執行緒程式設計
- 《java併發程式設計的藝術》執行緒池Java程式設計執行緒
- Java併發程式設計——深入理解執行緒池Java程式設計執行緒
- Java併發程式設計序列之執行緒狀態Java程式設計執行緒
- Java多執行緒學習筆記(自用)Java執行緒筆記
- Java併發程式設計之執行緒篇之執行緒的由來(一)Java程式設計執行緒
- Java執行緒與併發程式設計實踐----額外的執行緒能力Java執行緒程式設計
- 從執行緒到併發程式設計執行緒程式設計
- 併發程式設計與執行緒安全程式設計執行緒
- 【架構】Java併發程式設計——執行緒池的使用架構Java程式設計執行緒
- JAVA併發程式設計:執行緒池ThreadPoolExecutor原始碼分析Java程式設計執行緒thread原始碼