# 凍結執行緒
# sleep()
函數
sleep()
函數可以將執行緒休息片刻,如此便能暫緩執行緒的運行。sleep(s)
=> 代表休息 s
毫秒 (10-3 秒)
class multi_Test{ | |
private String name; | |
public multi_Test(String str){ | |
name=str; | |
} | |
public void run(){ | |
try{ | |
sleep((int)(1000*Math.random())); // 隨機停止 | |
} catch(InterruptedException e){} | |
System.out.println(name); | |
} | |
} |
sleep()
可能會拋出 InterruptedException
例外,
所以,將 sleep()
撰寫在 try-catch
區塊內。
Math.random()
可以產生範圍為 0~1 的浮點數,
乘上 1000,再強轉成整數就可以產生隨機休息的效果。
完整範例
class multi_Test extends Thread{ | |
private String name; | |
public multi_Test(String str){ | |
name=str; | |
} | |
public void run(){ | |
try{ | |
sleep((int)(1000*Math.random())); | |
}catch(InterruptedException e){} | |
System.out.println(name); | |
} | |
} | |
public class multi_thread{ | |
public static void main(String args[]){ | |
multi_Test apple=new multi_Test("apple"); | |
multi_Test pen=new multi_Test("pen"); | |
apple.start(); | |
pen.start(); | |
} | |
} |
# join()
函數
app.start(); | |
pen.start(); |
在上面的程式碼中,可以說是同時啟動的,那如果再啟動的下方再加上一行 main()運行結束
。
app.start(); | |
pen.start(); | |
System.out.println("main()運行結束"); |
會發現 main()運行結束
是第一個被打印出來的,所以,必須釐清, main()
本身也是一個執行緒,各執行緒會各自使用資源運行,所以,輸出字樣不必等待其他執行緒的運行,就理所當然的先打印出來了。
因此,想要達到上述的效果,就必須使用 join()
來處理執行緒的排程。
執行緒與另一個執行緒 join()
一起時:
當有其他執行緒呼叫 join()
,原來正執行的執行緒(或程式碼)會先暫停。
apple.start(); | |
try{ | |
apple.join(); | |
pen.start(); | |
pen.join(); | |
}catch(InterruptedException e){} | |
System.out.println("main() 結束"); |
在啟動 apple
執行緒後會先停留在 apple.join()
等待該執行緒完成,才會執行下一行程式(啟動 pen 執行緒);
同理 pen
執行緒會停留在 pen.join()
,等到執行緒結束後就會將字串「 main() 結束
」字串印出。
join()
會拋出 InterruptedException
例外,
因此才必須將 join()
寫在 try-catch
區塊,而 catch
要捕捉例外。
# 執行順序
Java 執行緒的優先順序是使用 1~10 來表示,數字大代表優先權較高(意指先執行)。
有兩個函數與優先權相關:
setPriority()
用來設定優先順序getPriority()
用來取得順序之值
而在setPriority()
的引數可以使用以下三個常用的代碼:MAX_PRIORTY
最大優先權數值MIN_PRIORTY
最小優先權數值NORM_PRIORTY
系統預設