并發(fā)(1)--基本的線程機(jī)制

1.Executor:Executor(執(zhí)行器)將為你管理Thread對(duì)象,Executor在客戶(hù)端和任務(wù)執(zhí)行之間提供了一個(gè)間接層。ExecutorService(具有服務(wù)生命周期的Executor,例如關(guān)閉)知道如何構(gòu)建恰當(dāng)?shù)纳舷挛膩?lái)執(zhí)行Runnable對(duì)象。
使用如下:

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
*/

對(duì)shutdown()方法的調(diào)用可以防止新的任務(wù)被提交給這個(gè)Executor,其中:
*CachedThreadPool 將為每個(gè)任務(wù)都創(chuàng)建一個(gè)線程, 它是合理的Executor的首選。
*FixedThreadPool將一次性預(yù)先執(zhí)行代價(jià)較高昂的線程分配,因而可以顯示線程數(shù)量,這可以節(jié)省時(shí)間,你不用為每個(gè)任務(wù)都固定地付出創(chuàng)建線程的開(kāi)銷(xiāo),在線程池中,現(xiàn)有線程在可能的情況下都會(huì)被自動(dòng)復(fù)用。
*SingleThreadExecutor是線程數(shù)量為1的FixedThreadPool,如果向SingleThreadExecutor提交了多個(gè)任務(wù),這些任務(wù)將排隊(duì)。

2.*優(yōu)先級(jí)
調(diào)度器更傾向于讓讓優(yōu)先級(jí)高的線程先執(zhí)行。但是并不是說(shuō)優(yōu)先級(jí)高的線程執(zhí)行時(shí)優(yōu)先級(jí)低的線程得不到執(zhí)行,也就是說(shuō),優(yōu)先級(jí)不會(huì)導(dǎo)致死鎖,優(yōu)先級(jí)低的線程僅僅是執(zhí)行的頻率較低。在絕大多時(shí)間里,所有線程都應(yīng)該以默認(rèn)的優(yōu)先級(jí)運(yùn)行,試圖操作線程的優(yōu)先級(jí)通常是一種錯(cuò)誤。
可以使用getPriority()方法獲得線程的優(yōu)先級(jí),使用setPriority(n)方法來(lái)設(shè)定線程優(yōu)先級(jí)。

public void run() {
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        System.out.println("hello thread! "+Thread.currentThread().getPriority());
    }

以上Thread.currentThread()可以獲得對(duì)驅(qū)動(dòng)該任務(wù)的Thread對(duì)象的引用,設(shè)置線程的優(yōu)先級(jí)一般在run()的開(kāi)頭不封設(shè)定,在構(gòu)造器中設(shè)定它們不會(huì)有任何好處,因?yàn)镋xecutor在此刻還沒(méi)有開(kāi)始執(zhí)行任務(wù)
3.讓步
當(dāng)任務(wù)已經(jīng)完成的差不多了覺(jué)得可以讓其他線程工作了的時(shí)候可以給線程調(diào)度機(jī)制一個(gè)暗示:你的工作已經(jīng)做得差不多了,可以讓其他線程使用cpu了,這個(gè)暗示將通過(guò)調(diào)用yield()方法(不過(guò)這只是一個(gè)暗示,沒(méi)有任何機(jī)制保證它將被采納)。當(dāng)調(diào)用yield()時(shí)你也是建議具有相同優(yōu)先級(jí)的其他線程可以運(yùn)行。
4.后臺(tái)線程
所謂后臺(tái)線程,是指在程序運(yùn)行時(shí)在后臺(tái)提供一種通用服務(wù)的線程,并且這種線程不屬于程序中不可或缺的一部份。在線程啟動(dòng)之前調(diào)用setDaemon()方法可以將線程設(shè)置為后臺(tái)線程,當(dāng)所有非后臺(tái)線程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死進(jìn)程中的所有后臺(tái)線程,后臺(tái)線程在不執(zhí)行finally子句的時(shí)候就會(huì)終止其run()方法。

for(int i = 0; i<10; i++) {
  Thread daemon = new Thread(new Test1);
  daemon.setDaemin(true);
  daemon.start();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容