# 凍結執行緒
# 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系統預設