1、線程的控制很常見,如文件傳送到一半時,需要暫停文件傳送,或終止文件傳送,這實際上就是控制線程的運行。
2、線程有創建、可運行、運行中、阻塞、死亡5個狀態。
創建:使用new運算符創建一個線程
可運行:使用start方法啟動一個線程后,系統分配了資源
運行中狀態:執行線程的run方法
阻塞:運行的線程因為某種原因停止繼續運行
死亡狀態:線程結束
3、傳統方法的安全問題
Thread的stop(),suspend(),resume(),destroy()方法,因為不安全,可能造成死鎖,已經不再使用了。
4、如何控制線程的運行
舉個例子,假如某個文件的傳輸需要10s,讓其傳輸到某個時刻暫停傳輸,然后繼續,到傳完為止。使用實現Runnable的方法完成,首先是文件傳輸的Runnable類
代碼如下:
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、運行,控制臺上將打印文件傳輸的模擬過程。可以看出,如果將該類對象以線程運行,while循環會執行10次后退出。
但是,需要在某個時刻(如5秒后)暫停線程運行(如1分鐘),但又不能使用Thread的相關函數,該怎么辦?
要解決這個問題,常見的方法如下:
1.當需要暫停時,干脆讓線程的run方法結束運行以釋放資源(實際上就是讓該線程永久結束)
2.線程需要繼續時,新開辟一個線程繼續工作
如何讓run方法結束呢,在run方法中有一個while循環,將改循環的標志由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();
}
}