1.Executor:Executor(執(zhí)行器)將為你管理Thread對象茄猫,Executor在客戶端和任務(wù)執(zhí)行之間提供了一個間接層骚揍。ExecutorService(具有服務(wù)生命周期的Executor雏节,例如關(guān)閉)知道如何構(gòu)建恰當?shù)纳舷挛膩韴?zhí)行Runnable對象幔翰。
使用如下:
public class Test1 implements Runnable {
private static int count = 0;
private final int id = count++;
public Test1() {
System.out.println();
}
@Override
public void run() {
System.out.println(id + " run() method is run");
Thread.yield();
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
// ExecutorService exec = Executors.newFixedThreadPool(3);
// ExecutorService exec = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
exec.execute(new Test1());
}
exec.shutdown();
}
}
/*Output:
0 run() method is run
1 run() method is run
2 run() method is run
3 run() method is run
4 run() method is run
*/
對shutdown()方法的調(diào)用可以防止新的任務(wù)被提交給這個Executor,其中:
*CachedThreadPool 將為每個任務(wù)都創(chuàng)建一個線程每辟, 它是合理的Executor的首選饺藤。
*FixedThreadPool將一次性預(yù)先執(zhí)行代價較高昂的線程分配包斑,因而可以顯示線程數(shù)量,這可以節(jié)省時間涕俗,你不用為每個任務(wù)都固定地付出創(chuàng)建線程的開銷罗丰,在線程池中,現(xiàn)有線程在可能的情況下都會被自動復(fù)用再姑。
*SingleThreadExecutor是線程數(shù)量為1的FixedThreadPool萌抵,如果向SingleThreadExecutor提交了多個任務(wù),這些任務(wù)將排隊元镀。
2.*優(yōu)先級:
調(diào)度器更傾向于讓讓優(yōu)先級高的線程先執(zhí)行绍填。但是并不是說優(yōu)先級高的線程執(zhí)行時優(yōu)先級低的線程得不到執(zhí)行,也就是說栖疑,優(yōu)先級不會導(dǎo)致死鎖讨永,優(yōu)先級低的線程僅僅是執(zhí)行的頻率較低。在絕大多時間里遇革,所有線程都應(yīng)該以默認的優(yōu)先級運行卿闹,試圖操作線程的優(yōu)先級通常是一種錯誤。
可以使用getPriority()方法獲得線程的優(yōu)先級萝快,使用setPriority(n)方法來設(shè)定線程優(yōu)先級锻霎。
public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
System.out.println("hello thread! "+Thread.currentThread().getPriority());
}
以上Thread.currentThread()可以獲得對驅(qū)動該任務(wù)的Thread對象的引用,設(shè)置線程的優(yōu)先級一般在run()的開頭不封設(shè)定揪漩,在構(gòu)造器中設(shè)定它們不會有任何好處旋恼,因為Executor在此刻還沒有開始執(zhí)行任務(wù)
3.讓步
當任務(wù)已經(jīng)完成的差不多了覺得可以讓其他線程工作了的時候可以給線程調(diào)度機制一個暗示:你的工作已經(jīng)做得差不多了,可以讓其他線程使用cpu了奄容,這個暗示將通過調(diào)用yield()方法(不過這只是一個暗示冰更,沒有任何機制保證它將被采納)产徊。當調(diào)用yield()時你也是建議具有相同優(yōu)先級的其他線程可以運行。
4.后臺線程
所謂后臺線程冬殃,是指在程序運行時在后臺提供一種通用服務(wù)的線程囚痴,并且這種線程不屬于程序中不可或缺的一部份。在線程啟動之前調(diào)用setDaemon()方法可以將線程設(shè)置為后臺線程审葬,當所有非后臺線程結(jié)束時,程序也就終止了奕谭,同時會殺死進程中的所有后臺線程涣觉,后臺線程在不執(zhí)行finally子句的時候就會終止其run()方法。
for(int i = 0; i<10; i++) {
Thread daemon = new Thread(new Test1);
daemon.setDaemin(true);
daemon.start();
}