Java互聯網架構師系統進階課程 【享學】

Java互聯網架構師系統進階課程 【享學】 第1講 線程基礎   線程之間的共享和協做

DownloadJava互聯網架構師系統進階課程 【享學】提娶馬:d17c java

1.1基礎概念

CPU核心數和線程數的關係面試

核心數:線程數=1:1  ;Intel使用了超線程技術後---> 1:2編程

CPU時間片輪起色制安全

又稱RR調度,會致使上下文切換(上下文切換須要時間)多線程

 

什麼是進程和線程架構

進程:程序運行資源分配的最小單位,進程內部有多個線程,會共享這個進程的資源併發

線程:CPUVcmL46679910調度的最小單位,必須依賴進程而存在。異步

 

澄清並行和併發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


watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

高併發編程的意義、好處和注意事項

好處:充分利用cpu的資源(通常電腦都是多核心的四核八線程)、加快用戶響應的時間,程序模塊化,異步化

問題:

線程共享資源,存在衝突;

容易致使死鎖;

啓用太多的線程,就有搞垮機器的可能

1.2認識Java裏的線程

Java裏的程序天生就是多線程的,那麼有幾種新啓線程的方式?

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

新啓線程的方式

類Thread

接口Runnable

接口CallableVcmL46679910

 怎麼樣才能讓Java裏的線程安全中止工做呢

線程天然終止:天然執行完或拋出未處理異常

stop(),resume(),suspend()已不建議使用,stop()會致使線程不會正確釋放資源,suspend()容易致使死鎖。

  • interrupt():

java線程是協做式,而非搶佔式。

調用一個線程的interrupt() 方法中斷一個線程,並非強行關閉這個線程,只是跟這個線程打個招呼,將線程的中斷標誌位置爲true,線程是否中斷,由線程自己決定。

  • isInterrupted():

斷定當前線程是否處於中斷狀態。

  • interrupted():

static方法interrupted() 斷定當前線程是否處於中斷狀態,同時中斷標誌位改成false。

方法裏若是拋出InterruptedException,線程的中斷標誌位會被複位成false,若是確實是須要中斷線程,要求咱們本身在catch語句塊裏再次調用interrupt()。

1.3對Java裏的線程再多一點點認識

線程經常使用方法和線程的狀態

 watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

線程只有5種狀態。整個生命週期就是這幾種狀態的切換。

run()和start() :run方法就是普通對象的普通方法,只有調用了start()後,Java纔會將線程對象和操做系統中實際的線程進行映射,再來執行run方法。

yield() :讓出cpu的執行權,將線程從運行轉到可運行狀態,可是下個時間片,該線程依然有可能被再次選中運行。

線程的優先級

取值爲1~10,缺省爲5,但線程的優先級不可靠,不建議做爲線程開發時候的手段  //beCalled.setPriority(newPriority);

守護線程

和主線程共死,finally不能保證必定執行

1.4線程間的共享

synchronized內置鎖

對象鎖,鎖的是類的對象實例。

類鎖 ,鎖的是每一個類的的Class對象,每一個類的的Class對象在一個虛擬機中只有一個,因此類鎖也只有一個。

volatile關鍵字

適合於只有一個線程寫,多個線程讀的場景,由於它只能確保可見性。

ThreadLocal

線程變量。能夠理解爲是個map,類型 Map<Thread,Integer>

1.5線程間協做

輪詢:難以保證及時性,資源開銷很大,

等待和通知

wait()    VcmL46679910對象上的方法

notify/notifyAll  對象上的方法

 

等待和通知的標準範式

等待方:

  • 獲取對象的鎖;
  • 循環裏判斷條件是否知足,不知足調用wait方法,
  • 條件知足執行業務邏輯

通知方來講

  • 獲取對象的鎖;
  • 改變條件
  • 通知全部等待在對象的線程

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;

join()方法

面試點

線程A,執行了線程B的joinVcmL46679910方法,線程A必需要等待B執行完成了之後,線程A才能繼續本身的工做

調用yield() sleep()wait()notify()等方法對鎖有何影響? 

面試點

線程在執行yield()之後,持有的鎖是不釋放的

sleep()方法被調用之後,持有的鎖是不釋放的

調動方法以前,必需要持有鎖。調用了wait()方法之後,鎖就會被釋放,當wait方法返回的時候,線程會從新持有鎖

調動方法以前,必需要持有鎖,調用notify()方法自己不會釋放鎖的

相關文章
相關標籤/搜索