Java實現(xiàn)線程的暫停和恢復(fù)的示例詳解
問題思路
在Java中,線程的暫停和恢復(fù)可以通過Thread類的interrupt方法實現(xiàn)。需要注意的是,interrupt方法并不會立即停止線程,而是會設(shè)置一個中斷標(biāo)記,你需要在你的線程中適當(dāng)?shù)仨憫?yīng)這個中斷。
以下是一個簡單的示例:
問題答案
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;
}
}
在這個例子中,我們創(chuàng)建了一個繼承自Thread的類,并添加了一個isInterrupted標(biāo)志來跟蹤線程是否被中斷。在run方法中,我們檢查這個標(biāo)志,如果它被設(shè)置為true,那么我們就退出循環(huán),線程就會結(jié)束。
你可以通過調(diào)用interruptThread方法來中斷線程,并通過調(diào)用resetInterrupt方法來重置中斷狀態(tài)。需要注意的是,當(dāng)線程被中斷時,它會拋出InterruptedException,你需要在你的代碼中處理這個異常。
其他方法
自定義線程類(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)用該方法實現(xiàn)線程的暫停
*/
void pauseThread(){
pause = true;
}
/*
調(diào)用該方法實現(xiàn)恢復(fù)線程的運(yùn)行
*/
void resumeThread(){
pause =false;
synchronized (lock){
lock.notify();
}
}
/**
* 這個方法只能在run 方法中實現(xiàn),不然會阻塞主線程,導(dǎo)致頁面無響應(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;
}
}
}
}
上面代碼中,有注釋,其實大家應(yīng)該都看得懂,那么主要是我們使用同步鎖synchronized對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é)果,會在前一秒內(nèi)瘋狂自增,之后在聽五秒后,又開始繼續(xù)自增;
最后
以上就是Java實現(xiàn)線程的暫停和恢復(fù)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程暫停和恢復(fù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
idea2019版與maven3.6.2版本不兼容的解決方法
這篇文章主要介紹了idea2019版與maven3.6.2版本不兼容的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
MAC環(huán)境下安裝多個JDK的實現(xiàn)步驟
為了能夠在Mac上管理多個JDK版本,首先需要安裝這些不同的JDK版本,這篇文章主要介紹了MAC環(huán)境下安裝多個JDK的實現(xiàn)步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
SpringBoot配置Spring?Security的實現(xiàn)示例
本文主要介紹了SpringBoot配置Spring?Security的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
Java為什么匿名內(nèi)部類參數(shù)引用需要用final進(jìn)行修飾?
今天小編就為大家分享一篇關(guān)于Java為什么匿名內(nèi)部類參數(shù)引用需要用final進(jìn)行修飾?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
Java調(diào)用SQL腳本執(zhí)行常用的方法示例
這篇文章主要給大家介紹了關(guān)于Java調(diào)用SQL腳本執(zhí)行常用的方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04

