java控制線程運行
1、線程的控制很常見,如文件傳送到一半時,需要暫停文件傳送,或終止文件傳送,這實際上就是控制線程的運行。
2、線程有創(chuàng)建、可運行、運行中、阻塞、死亡5個狀態(tài)。
創(chuàng)建:使用new運算符創(chuàng)建一個線程
可運行:使用start方法啟動一個線程后,系統(tǒng)分配了資源
運行中狀態(tài):執(zhí)行線程的run方法
阻塞:運行的線程因為某種原因停止繼續(xù)運行
死亡狀態(tài):線程結(jié)束
3、傳統(tǒng)方法的安全問題
Thread的stop(),suspend(),resume(),destroy()方法,因為不安全,可能造成死鎖,已經(jīng)不再使用了。
4、如何控制線程的運行
舉個例子,假如某個文件的傳輸需要10s,讓其傳輸?shù)侥硞€時刻暫停傳輸,然后繼續(xù),到傳完為止。使用實現(xiàn)Runnable的方法完成,首先是文件傳輸?shù)腞unnable類
代碼如下:
public class ThreadControlTest1 implements Runnable
{
private int percent = 0;
public void run()
{
while(true)
{
System.out.println("傳送進度:"+ 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、運行,控制臺上將打印文件傳輸?shù)哪M過程??梢钥闯觯绻麑⒃擃悓ο笠跃€程運行,while循環(huán)會執(zhí)行10次后退出。
但是,需要在某個時刻(如5秒后)暫停線程運行(如1分鐘),但又不能使用Thread的相關(guān)函數(shù),該怎么辦?
要解決這個問題,常見的方法如下:
1.當(dāng)需要暫停時,干脆讓線程的run方法結(jié)束運行以釋放資源(實際上就是讓該線程永久結(jié)束)
2.線程需要繼續(xù)時,新開辟一個線程繼續(xù)工作
如何讓run方法結(jié)束呢,在run方法中有一個while循環(huán),將改循環(huán)的標志由true改為false即可。
6、上面的代碼可以改為如下:
public class ThreadControlTest1 implements Runnable
{
private int percent = 0;
private boolean isRun = true;
public void run()
{
while(isRun)
{
System.out.println("傳送進度:"+ 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();
}
}
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之順序表的實現(xiàn)
線性表(linear?list)是n個具有相同特性的數(shù)據(jù)元素的有限序列。順序表是常見的線性表之一,本文將詳細講講順序表的原理與實現(xiàn),需要的可以參考一下2022-08-08
詳解SpringBoot實現(xiàn)JPA的save方法不更新null屬性
直接調(diào)用原生Save方法會導(dǎo)致null屬性覆蓋到數(shù)據(jù)庫,使用起來十分不方便。本文詳細的介紹了如何解決這個問題,非常具有實用價值,需要的朋友可以參考下2018-12-12
Maven設(shè)置JDK版本的兩種方法實現(xiàn)
本文主要介紹了Maven設(shè)置JDK版本的兩種方法實現(xiàn),是通過Apache Maven Compiler Plugin插件實現(xiàn)的,具有一定的參考價值,感興趣的可以了解一下2024-07-07
SpringBoot實現(xiàn)阿里云短信接口對接的示例代碼
這篇文章主要介紹了SpringBoot實現(xiàn)阿里云短信接口對接的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Spring @Transaction 注解執(zhí)行事務(wù)的流程
這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開啟事務(wù)的?又是如何進行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細介紹,需要的朋友可以參考下2021-06-06
Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解
這篇文章主要為大家介紹了Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

