詳解java線程的開始、暫停、繼續(xù)
Android項(xiàng)目中的一個(gè)需求:通過線程讀取文件內(nèi)容,并且可以控制線程的開始、暫停、繼續(xù),來控制讀文件。在此記錄下。
直接在主線程中,通過wait、notify、notifyAll去控制讀文件的線程(子線程),報(bào)錯(cuò):java.lang.IllegalMonitorStateException。
需要注意的幾個(gè)問題:
- 任何一個(gè)時(shí)刻,對(duì)象的控制權(quán)(monitor)只能被一個(gè)線程擁有。
- 無論是執(zhí)行對(duì)象的wait、notify還是notifyAll方法,必須保證當(dāng)前運(yùn)行的線程取得了該對(duì)象的控制權(quán)(monitor)。
- 如果在沒有控制權(quán)的線程里執(zhí)行對(duì)象的以上三種方法,就會(huì)報(bào)錯(cuò)java.lang.IllegalMonitorStateException。
- JVM基于多線程,默認(rèn)情況下不能保證運(yùn)行時(shí)線程的時(shí)序性。
線程取得控制權(quán)的3種方法:
- 執(zhí)行對(duì)象的某個(gè)同步實(shí)例方法。
- 執(zhí)行對(duì)象對(duì)應(yīng)類的同步靜態(tài)方法。
- 執(zhí)行對(duì)該對(duì)象加同步鎖的同步塊。
這里將開始、暫停、繼續(xù)封裝在線程類中,直接調(diào)用該實(shí)例的方法就行。
public class ReadThread implements Runnable{
public Thread t;
private String threadName;
boolean suspended=false;
public ReadThread(String threadName){
this.threadName=threadName;
System.out.println("Creating " + threadName );
}
public void run() {
for(int i = 10; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
try {
Thread.sleep(300);
synchronized(this) {
while(suspended) {
wait();
}
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
e.printStackTrace();
}
System.out.println("Thread " + threadName + " exiting.");
}
}
/**
* 開始
*/
public void start(){
System.out.println("Starting " + threadName );
if(t==null){
t=new Thread(this, threadName);
t.start();
}
}
/**
* 暫停
*/
void suspend(){
suspended = true;
}
/**
* 繼續(xù)
*/
synchronized void resume(){
suspended = false;
notify();
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Java Floyd算法求有權(quán)圖(非負(fù)權(quán))的最短路徑并打印
這篇文章主要介紹了Java Floyd算法求有權(quán)圖(非負(fù)權(quán))的最短路徑并打印,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Springboot項(xiàng)目如何兼容老的Spring項(xiàng)目問題
這篇文章主要介紹了Springboot項(xiàng)目如何兼容老的Spring項(xiàng)目問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java的數(shù)據(jù)類型和參數(shù)傳遞(詳解)
下面小編就為大家?guī)硪黄狫ava的數(shù)據(jù)類型和參數(shù)傳遞(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
java基于JDBC連接Oracle 11g Release2實(shí)例分析
這篇文章主要介紹了java基于JDBC連接Oracle 11g Release2的方法,實(shí)例分析了JDBC連接Oracle 11g Release2容易出現(xiàn)的異常與解決方法,需要的朋友可以參考下2015-06-06
SpringBoot業(yè)務(wù)邏輯異常的處理方法介紹
本篇文章為大家展示了如何在SpringBoot中統(tǒng)一處理邏輯異常,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲2022-09-09
Java中PageHelper分頁后對(duì)list操作導(dǎo)致分頁無效
在項(xiàng)目中使用分頁插件的時(shí)候發(fā)現(xiàn)PageHelper插件失效了,本文就來介紹一下Java中PageHelper分頁后對(duì)list操作導(dǎo)致分頁無效的解決方法,感興趣的可以了解一下2021-05-05

