java控制線程運(yùn)行
1、線程的控制很常見,如文件傳送到一半時(shí),需要暫停文件傳送,或終止文件傳送,這實(shí)際上就是控制線程的運(yùn)行。
2、線程有創(chuàng)建、可運(yùn)行、運(yùn)行中、阻塞、死亡5個(gè)狀態(tài)。
創(chuàng)建:使用new運(yùn)算符創(chuàng)建一個(gè)線程
可運(yùn)行:使用start方法啟動(dòng)一個(gè)線程后,系統(tǒng)分配了資源
運(yùn)行中狀態(tài):執(zhí)行線程的run方法
阻塞:運(yùn)行的線程因?yàn)槟撤N原因停止繼續(xù)運(yùn)行
死亡狀態(tài):線程結(jié)束
3、傳統(tǒng)方法的安全問題
Thread的stop(),suspend(),resume(),destroy()方法,因?yàn)椴话踩?,可能造成死鎖,已經(jīng)不再使用了。
4、如何控制線程的運(yùn)行
舉個(gè)例子,假如某個(gè)文件的傳輸需要10s,讓其傳輸?shù)侥硞€(gè)時(shí)刻暫停傳輸,然后繼續(xù),到傳完為止。使用實(shí)現(xiàn)Runnable的方法完成,首先是文件傳輸?shù)腞unnable類
代碼如下:
public class ThreadControlTest1 implements Runnable
{
private int percent = 0;
public void run()
{
while(true)
{
System.out.println("傳送進(jìn)度:"+ percent +"%");
try
{
Thread.sleep(1000);
}
catch(Exception ex)
{}
percent += 10;
if(percent == 100)
{
System.out.println("傳送完畢");
break;
}
}
}
public static void main(String[] args)
{
ThreadControlTest1 ft = new ThreadControlTest1();
Thread th = new Thread(ft);
th.start();
}
}
5、運(yùn)行,控制臺(tái)上將打印文件傳輸?shù)哪M過程。可以看出,如果將該類對(duì)象以線程運(yùn)行,while循環(huán)會(huì)執(zhí)行10次后退出。
但是,需要在某個(gè)時(shí)刻(如5秒后)暫停線程運(yùn)行(如1分鐘),但又不能使用Thread的相關(guān)函數(shù),該怎么辦?
要解決這個(gè)問題,常見的方法如下:
1.當(dāng)需要暫停時(shí),干脆讓線程的run方法結(jié)束運(yùn)行以釋放資源(實(shí)際上就是讓該線程永久結(jié)束)
2.線程需要繼續(xù)時(shí),新開辟一個(gè)線程繼續(xù)工作
如何讓run方法結(jié)束呢,在run方法中有一個(gè)while循環(huán),將改循環(huán)的標(biāo)志由true改為false即可。
6、上面的代碼可以改為如下:
public class ThreadControlTest1 implements Runnable
{
private int percent = 0;
private boolean isRun = true;
public void run()
{
while(isRun)
{
System.out.println("傳送進(jìn)度:"+ percent +"%");
try
{
Thread.sleep(1000);
}
catch(Exception ex)
{}
percent += 10;
if(percent == 100)
{
System.out.println("傳送完畢");
break;
}
}
}
public static void main(String[] args)
{
ThreadControlTest1 ft = new ThreadControlTest1();
Thread th = new Thread(ft);
th.start();
try
{
Thread.sleep(5000);
}catch(Exception ex)
{}
ft.isRun = false;
System.out.println("暫停一分鐘");
try
{
Thread.sleep(1000*60);
}catch(Exception ex)
{}
ft.isRun = true;
th = new Thread(ft);
th.start();
}
}
- Java使用Condition控制線程通信的方法實(shí)例詳解
- Java使用阻塞隊(duì)列控制線程通信的方法實(shí)例詳解
- Java編程中實(shí)現(xiàn)Condition控制線程通信
- java線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法
- Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 舉例講解Java中Piped管道輸入輸出流的線程通信控制
- Java中使用阻塞隊(duì)列控制線程集實(shí)例
- Java線程的控制詳解
- java信號(hào)量控制線程打印順序的示例分享
- Java join 線程控制用法
- Java 控制線程的方法
相關(guān)文章
如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息
這篇文章主要介紹了如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01servlet基礎(chǔ)知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了servlet基礎(chǔ)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Java中的ThreadLocal與ThreadLocalMap詳解
這篇文章主要介紹了Java中的ThreadLocal與ThreadLocalMap詳解,ThreadLocal 是一個(gè)線程局部變量,其實(shí)的功用非常簡單,就是為每一個(gè)使用該變量的線程都提供一個(gè)變量值的副本,是Java中一種較為特殊的線程綁定機(jī)制,需要的朋友可以參考下2023-09-09