Java實(shí)現(xiàn)線程的暫停和恢復(fù)的示例詳解
問題思路
在Java中,線程的暫停和恢復(fù)可以通過Thread類的interrupt方法實(shí)現(xiàn)。需要注意的是,interrupt方法并不會(huì)立即停止線程,而是會(huì)設(shè)置一個(gè)中斷標(biāo)記,你需要在你的線程中適當(dāng)?shù)仨憫?yīng)這個(gè)中斷。
以下是一個(gè)簡(jiǎn)單的示例:
問題答案
public class MyThread extends Thread { private volatile boolean isInterrupted = false; @Override public void run() { while (!isInterrupted) { // 線程正在執(zhí)行的任務(wù)... } } public void interruptThread() { isInterrupted = true; } public void resetInterrupt() { isInterrupted = false; } }
在這個(gè)例子中,我們創(chuàng)建了一個(gè)繼承自Thread的類,并添加了一個(gè)isInterrupted標(biāo)志來跟蹤線程是否被中斷。在run方法中,我們檢查這個(gè)標(biāo)志,如果它被設(shè)置為true,那么我們就退出循環(huán),線程就會(huì)結(jié)束。
你可以通過調(diào)用interruptThread方法來中斷線程,并通過調(diào)用resetInterrupt方法來重置中斷狀態(tài)。需要注意的是,當(dāng)線程被中斷時(shí),它會(huì)拋出InterruptedException,你需要在你的代碼中處理這個(gè)異常。
其他方法
自定義線程類(MyThread)
package com.example.wangjun.myapplication; import android.util.Log; public class MyThread extends Thread { private final Object lock = new Object(); private boolean pause = false; /** * 調(diào)用該方法實(shí)現(xiàn)線程的暫停 */ void pauseThread(){ pause = true; } /* 調(diào)用該方法實(shí)現(xiàn)恢復(fù)線程的運(yùn)行 */ void resumeThread(){ pause =false; synchronized (lock){ lock.notify(); } } /** * 這個(gè)方法只能在run 方法中實(shí)現(xiàn),不然會(huì)阻塞主線程,導(dǎo)致頁(yè)面無(wú)響應(yīng) */ void onPause() { synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void run() { super.run(); int index = 0; while(true){ while (pause){ onPause(); } try { System.out.println(index); Thread.sleep(50); ++index; }catch (Exception e){ e.printStackTrace(); break; } } } }
上面代碼中,有注釋,其實(shí)大家應(yīng)該都看得懂,那么主要是我們使用同步鎖synchronized對(duì)Objecy類型的lock進(jìn)行同步,并在OnPause()方法中進(jìn)行wait()方法,線程等待,又在resumeThread()方法中進(jìn)行了解鎖notify(),所以我們就能進(jìn)行線程的暫停和繼續(xù)的操作了
方法的調(diào)用
MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); try { sleep(1000); my.pauseThread(); sleep(5000); my.resumeThread(); } catch (InterruptedException e) { e.printStackTrace(); }
出現(xiàn)的結(jié)果,會(huì)在前一秒內(nèi)瘋狂自增,之后在聽五秒后,又開始繼續(xù)自增;
最后
以上就是Java實(shí)現(xiàn)線程的暫停和恢復(fù)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程暫停和恢復(fù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP代碼案例
這篇文章主要介紹了注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP的方法介紹,文中有詳細(xì)的代碼示例,對(duì)我們的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下2023-06-06使用Java如何將圖片轉(zhuǎn)成Base64編碼,并壓縮至40k
這篇文章主要介紹了使用Java如何將圖片轉(zhuǎn)成Base64編碼,并壓縮至40k問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解
這篇文章主要介紹了Java實(shí)現(xiàn)TCP和UDP協(xié)議詳解,TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是兩種最常用的傳輸層協(xié)議,它們都用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),但是它們之間有很多不同之處,需要的朋友可以參考下2023-07-07Java中字節(jié)流和字符流的理解(超精簡(jiǎn)!)
Java通過稱為流的抽象來執(zhí)行I/O操作,下面這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流和字符流理解,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07JavaWeb 實(shí)現(xiàn)驗(yàn)證碼功能(demo)
在 WEB-APP 中一般應(yīng)用于:登錄、注冊(cè)、買某票、秒殺等場(chǎng)景,大家都接觸過這個(gè)驗(yàn)證碼操作,今天小編通過實(shí)例代碼給大家講解javaweb實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友參考下2017-02-02