Download:Java互聯網架構師系統進階課程 【享學】提娶馬:d17c java
CPU核心數和線程數的關係面試
核心數:線程數=1:1 ;Intel使用了超線程技術後---> 1:2編程
CPU時間片輪起色制安全
又稱RR調度,會致使上下文切換(上下文切換須要時間)多線程
什麼是進程和線程架構
進程:程序運行資源分配的最小單位,進程內部有多個線程,會共享這個進程的資源併發
線程:CPUV(cmL46679910)調度的最小單位,必須依賴進程而存在。異步
澄清並行和併發ide
並行:同一時刻,能夠同時處理事情的能力模塊化
併發:與單位時間相關,在單位時間內能夠處理事情的能力
/** *類說明:測試線程,線程的工做是將ThreadLocal變量的值變化,並寫回,看看線程之間是否會互相影響 */ public static class TestThread implements Runnable{ int id; public TestThread(int id){ this.id = id; } public void run() { System.out.println(Thread.currentThread().getName()+":start"); Integer s = threadLaocl.get();//得到變量的值 s = s+id; threadLaocl.set(s); System.out.println(Thread.currentThread().getName()+":" +threadLaocl.get()); //threadLaocl.remove(); } } public static void main(String[] args){ UseThreadLocal test = new UseThreadLocal(); test.StartThreadArray(); } } V:itit9696
高併發編程的意義、好處和注意事項
好處:充分利用cpu的資源(通常電腦都是多核心的四核八線程)、加快用戶響應的時間,程序模塊化,異步化
問題:
線程共享資源,存在衝突;
容易致使死鎖;
啓用太多的線程,就有搞垮機器的可能
Java裏的程序天生就是多線程的,那麼有幾種新啓線程的方式?
public class OnlyMain { public static void main(String[] args) { //虛擬機線程管理的接口 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false); for(ThreadInfo threadInfo:threadInfos) { System.out.println("["+threadInfo.getThreadId()+"]"+" " +threadInfo.getThreadName()); } } V:itit9696
新啓線程的方式
類Thread
接口Runnable
接口CallableV(cmL46679910)
怎麼樣才能讓Java裏的線程安全中止工做呢
線程天然終止:天然執行完或拋出未處理異常
stop(),resume(),suspend()已不建議使用,stop()會致使線程不會正確釋放資源,suspend()容易致使死鎖。
java線程是協做式,而非搶佔式。
調用一個線程的interrupt() 方法中斷一個線程,並非強行關閉這個線程,只是跟這個線程打個招呼,將線程的中斷標誌位置爲true,線程是否中斷,由線程自己決定。
斷定當前線程是否處於中斷狀態。
static方法interrupted() 斷定當前線程是否處於中斷狀態,同時中斷標誌位改成false。
方法裏若是拋出InterruptedException,線程的中斷標誌位會被複位成false,若是確實是須要中斷線程,要求咱們本身在catch語句塊裏再次調用interrupt()。
線程只有5種狀態。整個生命週期就是這幾種狀態的切換。
run()和start() :run方法就是普通對象的普通方法,只有調用了start()後,Java纔會將線程對象和操做系統中實際的線程進行映射,再來執行run方法。
yield() :讓出cpu的執行權,將線程從運行轉到可運行狀態,可是下個時間片,該線程依然有可能被再次選中運行。
取值爲1~10,缺省爲5,但線程的優先級不可靠,不建議做爲線程開發時候的手段 //beCalled.setPriority(newPriority);
和主線程共死,finally不能保證必定執行
對象鎖,鎖的是類的對象實例。
類鎖 ,鎖的是每一個類的的Class對象,每一個類的的Class對象在一個虛擬機中只有一個,因此類鎖也只有一個。
適合於只有一個線程寫,多個線程讀的場景,由於它只能確保可見性。
線程變量。能夠理解爲是個map,類型 Map<Thread,Integer>
輪詢:難以保證及時性,資源開銷很大,
wait() V(cmL46679910)對象上的方法
notify/notifyAll 對象上的方法
等待和通知的標準範式
等待方:
通知方來講
notify和notifyAll應該用誰?
應該儘可能使用notifyAll,使用notify由於有可能發生信號丟失的的狀況
等待超時模式實現一個鏈接池
假設 等待時間時長爲T,當前時間now+T之後超時
long overtime = now+T; long remain = T;//等待的持續時間 while(result不知足條件&& remain>0){ wait(remain); remain = overtime – now;//等待剩下的持續時間 } return result;
面試點
線程A,執行了線程B的joinV(cmL46679910)方法,線程A必需要等待B執行完成了之後,線程A才能繼續本身的工做
面試點
線程在執行yield()之後,持有的鎖是不釋放的
sleep()方法被調用之後,持有的鎖是不釋放的
調動方法以前,必需要持有鎖。調用了wait()方法之後,鎖就會被釋放,當wait方法返回的時候,線程會從新持有鎖
調動方法以前,必需要持有鎖,調用notify()方法自己不會釋放鎖的