并發(fā)
并發(fā)主要解決:“速度” 和“設(shè)計(jì)可管理性” 問(wèn)題
java的線程機(jī)制是搶占式的,表示 調(diào)度機(jī)制會(huì)周期性的中斷線程,將上下文切換到另一個(gè)線程,從而為每個(gè)線程都提供時(shí)間片,使的每個(gè)線程都會(huì)分配到數(shù)量合理的時(shí)間去驅(qū)動(dòng)它的任務(wù)。
Runnable接口描述任務(wù),實(shí)際實(shí)現(xiàn)在run方法中。
Thread.yield()方法對(duì)線程調(diào)度器的調(diào)用的一種建議,表示通知cpu將一個(gè)線程轉(zhuǎn)到另一個(gè)線程,但是不實(shí)際執(zhí)行情況不一定會(huì)轉(zhuǎn)到另一個(gè)線程上去。這是一種選擇性的。
Thread類
使用方式:
Thread t = new Thread(new Runnable());
t.start();
每個(gè)Thread都會(huì)“注冊(cè)”自己,自己引用自己,在它任務(wù)退出run()并且死亡之前,垃圾處理器無(wú)法回收它
Executor
用來(lái)管理Thread對(duì)象,允許管理異步任務(wù)的執(zhí)行,無(wú)需顯示的管理線程的生命周期
使用方式:
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new Runnable());
線程池:
CachedThreadPool : 每創(chuàng)建一個(gè)任務(wù),創(chuàng)建一個(gè)線程,在程序執(zhí)行過(guò)程中通常會(huì)創(chuàng)建與所需數(shù)量相同的線程,然后在它回收舊線程時(shí)停止創(chuàng)建新線程
FixedThreadPool :使用有限的線程來(lái)執(zhí)行所提交的任務(wù)
SingleThreadExecutor :線程數(shù)量為1的FixedThreadPool,如果向SingleThreadExecutor提交多個(gè)任務(wù),那么這些任務(wù)將會(huì)排隊(duì)執(zhí)行每個(gè)任務(wù)都會(huì)在下一個(gè)任務(wù)開(kāi)始之前運(yùn)行結(jié)束,所有的任務(wù)都將使用同一個(gè)線程。
從任務(wù)中返回值(Callable接口)
Runnable接口沒(méi)有返回值,需要執(zhí)行的任務(wù)返回結(jié)果,使用Callable接口(具有泛型的類型參數(shù)),它的類型參數(shù)表示的是從call()方法中返回的值,并切必須使用ExecutorService.submit()方法調(diào)用它。
使用方式:
//自定義callable接口
class IvyCallable implements Callable<String> {
public void IvyCallable(){}
public String call(){
return "返回期望返回的類型";
}
}
//demo
ExecutorService exec = Executors.newCachedThreadPool();
Feture<String> future = exec.submit(new IvyCallable());
submit()方法會(huì)產(chǎn)生Future對(duì)象,它用Callable返回結(jié)果的特定類型進(jìn)行了參數(shù)化??梢允褂?strong>Future.isDone()查詢Future是否已經(jīng)完成,任務(wù)完成時(shí),調(diào)用Future.get()方法來(lái)獲取任務(wù)執(zhí)行的返回結(jié)果??梢圆挥胕sDone()進(jìn)行檢查就直接調(diào)用get(),這種情況下,gei()將阻塞,直至結(jié)果準(zhǔn)備就緒。
線程優(yōu)先級(jí)
線程的優(yōu)先級(jí)將線程的重要性傳遞給調(diào)度器。cpu處理處理線程集的順序是不確定的,但是調(diào)度器將傾向于優(yōu)先級(jí)最高的線程優(yōu)先執(zhí)行。優(yōu)先級(jí)較低的線程執(zhí)行的頻率較低。
getPriority()來(lái)讀取現(xiàn)有線程的優(yōu)先級(jí),setPriority()設(shè)置線程優(yōu)先級(jí)。在一個(gè)任務(wù)的內(nèi)部,可以通過(guò)調(diào)用Thread.currentThread()來(lái)獲的對(duì)驅(qū)動(dòng)該任務(wù)的Thread對(duì)象的引用。
優(yōu)先級(jí) 級(jí)別: MAX_PRIORITY、NORM_PRIORITY、MIN_PRIORITY
讓步
給調(diào)度器一個(gè)暗示,表示任務(wù)已經(jīng)執(zhí)行的差不多了,可以讓別的線程使用cpu了。但是不能保證一定會(huì)被采納 ,通過(guò)調(diào)用yield()方法實(shí)現(xiàn)。
后臺(tái)線程
含義:指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程,并且這種線程并不屬于程序中不可或缺的部分。
只要有任務(wù)非后臺(tái)線程還在運(yùn)行,程序就不會(huì)終止。
設(shè)置后臺(tái)線程:
thread daemon = new thread(new runanble());
daemon.setdaemon(true); //設(shè)置后臺(tái)線程
daemon.start();
必須在線程啟動(dòng)前設(shè)置
可以通過(guò)isDaemon()方法來(lái)確定線程是否是一個(gè)后臺(tái)線程,如果是一個(gè)后臺(tái)線程,那么它創(chuàng)建的線程都被自動(dòng)設(shè)置成后臺(tái)線程。
后臺(tái)線程不會(huì)執(zhí)行finnally語(yǔ)句
加入一個(gè)線程
一個(gè)線程可以在其他線程之上調(diào)用join()方法,其效果是等待一段時(shí)間直到第二個(gè)線程結(jié)束才繼續(xù)執(zhí)行。