1) 線程的幾種狀態(tài)
·????初始狀態(tài):new Thread 進(jìn)入初始狀態(tài)
????·可運(yùn)行狀態(tài)(就緒狀態(tài)):調(diào)用線程的start方法,進(jìn)入可運(yùn)行狀態(tài)
·????運(yùn)行狀態(tài):OS選中片效,此進(jìn)程獲得cpu的時間片仓洼,該線程開始執(zhí)行run方法,進(jìn)入運(yùn)行狀態(tài)
·????阻塞狀態(tài):調(diào)用Thread.sleep方法(sleep結(jié)束進(jìn)入就緒狀態(tài))堤舒、調(diào)用其他線程的join方法(其他線程執(zhí)行結(jié)束進(jìn)入就緒狀態(tài))、等待用戶輸入(用戶輸入完哺呜,進(jìn)入就緒狀態(tài))等進(jìn)入阻塞狀態(tài)
·????死亡狀態(tài):run方法執(zhí)行結(jié)束舌缤,進(jìn)入死亡狀態(tài)
另外,線程執(zhí)行過程中:
1、遇到同步鎖Synchronized時国撵,進(jìn)入鎖池隊列陵吸;
2、調(diào)用wait方法介牙,該進(jìn)程進(jìn)去等待序列壮虫,等待其他進(jìn)程調(diào)用notify或者notifyAll喚醒
3、鎖池隊列的線程拿到對象鎖時环础,線程進(jìn)入就緒狀態(tài)
4囚似、調(diào)用Thread.yield()方法,讓出cpu資源线得,進(jìn)入就緒狀態(tài)與其他線程一起競爭資源
2) 線程相關(guān)的幾個方法
線程的方法:
Thread.sleep(long milSecond);靜態(tài)方法饶唤,調(diào)用肯定是當(dāng)前線程執(zhí)行
Thread.yield(); 靜態(tài)方法贯钩,調(diào)用肯定是當(dāng)前線程執(zhí)行
t.join()或者t.join(long milSecond); 成員方法募狂,將cpu資源讓給t,t執(zhí)行完畢或者執(zhí)行到milSecond時角雷,進(jìn)入就緒狀態(tài)
對象方法:
obj.wait(); 調(diào)用線程進(jìn)入等待隊列
obj.notify(); 喚醒等待隊列中監(jiān)聽該對象的某個線程進(jìn)入鎖池隊列
obj.notifyAll(); 喚醒等待隊列中監(jiān)聽該對象的所有線程進(jìn)入鎖池隊列
3) 四種常用線程池:
ExecutorService是Java提供的用于管理線程池的類祸穷。該類的兩個作用:控制線程數(shù)量和重用線程
·Executors.newCacheThreadPool():
可緩存線程池,先查看池中有沒有以前建立的線程勺三,如果有雷滚,就直接使用。如果沒有檩咱,就建一個新的線程加入池中揭措,緩存型池子通常用于執(zhí)行一些生存期很短的異步型任務(wù)
·Executors.newSingleThreadExecutor():
創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù)刻蚯,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行绊含。
·Executors.newFixedThreadPool(int n):
創(chuàng)建一個可重用固定個數(shù)的線程池,以共享的無界隊列方式來運(yùn)行這些線程炊汹。
·Executors.newScheduledThreadPool(int n):
創(chuàng)建一個定長線程池躬充,支持定時及周期性任務(wù)執(zhí)行
ScheduledExecutorService scheduledExecutorService=Executors.newScheduledThreadPool(10);
延遲三秒執(zhí)行:
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
}
},3,TimeUnit.SECONDS);
60秒后開始任務(wù),每執(zhí)行完一個任務(wù)后10秒開始下個任務(wù):
scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
}
},60,10,TimeUnit.SECONDS);
60秒后開始任務(wù)讨便,每隔10秒開始一個任務(wù):
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
}
},60,10,TimeUnit.SECONDS);