程序是一段靜態的代碼,進程是程序的一次動態執行過程,這個過程也是進程自己從產生、發展至消亡的過程。git
一、Java的多線程機制多線程
Java語言的一大特性點就是內置對多線程的支持。學習
多線程是指一個應用程序中同時存在幾個執行本,按幾條不一樣的執行線索共同工做的狀況。spa
計算機在任何給定的時刻只能執行線程中的一個。Java虛擬機快速地把控制從一個線程切換到另外一個線程,這些線程被輪流執行,使得每一個線程都有機會使用CPU資源。線程
主線程(main線程)負責執行main方法。對象
若是main方法中沒有建立其餘的線程,那麼當main方法執行完最後一個語句,即main方法返回時,JVM就會結束Java應用程序。若是main方法中又建立了其餘線程,那麼JVM就要在主線程和其餘線程之間輪流切換,保證,每一個線程都有機會使用CPU,main方法即便執行完最後的語句(主線程結束),JVM也不會結束Java應用程序,JVM一直要等到Java應用程序都結束以後,才結束Java應用程序。blog
Java語言使用Thread類及其子類的對象來表示線程。繼承
新建的線程在一個完整的生命週期中一般要經歷如下4個狀態:接口
新建:一個Thread類或其子類的對象被聲明並建立,已經有了相應的內存空間和其餘資源。生命週期
運行:JVM將CPU使用權切換給該線程時,此線程就能夠脫離建立它的主線程獨立開始本身的生命週期了。 若是線程是Thread的子類建立的,該類中的run()方法就馬上執行,且程序必須在子類中重寫父類的run()方法。 在線程沒有結束run()方法以前,不要讓線程再調用start()方法,不然將發生IllegalThreadStateException異常。
每一個Java線程的優先級都在常數1和10之間,即Thread.MIN_PRIORITY 和Thread.MAX_PRIORITY之間。若是沒有明確地設置線程的優先級別,,每一個線程的優先級都爲常數5,即Thread.NORM_PRIORITY。
能夠經過setPriority(int grade)方法調整優先級, getPriority 方法返回線程的優先級。
當線程使用CPU資源的時間到時後,即便線程沒有完成本身的所有操做,JVM也會中斷當前線程的執行,把CPU的使用權切換給下一個排隊等待的線程,當前線程將等待CPU資源的下一次輪迴,而後從中斷處繼續執行。
在編寫Thread類的子類時,須要重寫父類的run()方法。
優勢:能夠在子類中增長新的成員變量,實現城具備某種屬性,也能夠在子類中新增長方法,使線程具備某種功能。
Java不支持多繼承,Thread類的子類不能再擴展其餘的類。
用Thread類直接建立線程對象:Thread(Runnable target),該構造方法中的參數是一個Runnable類型的接口。 在建立線程對象時必須向構造方法的參數傳遞一個實現Runnable接口類的實例,該實例對象稱做所創線程的目標對象,當線程調用start()方法後,一旦輪到它來享用CPU資源,目標對象就會自動調用接口中的run()方法(接口回調)
對於使用同一目標對象的線程,目標對象的成員變量天然就是這些線程共享的數據單元,使用Runnable接口比使用Thread的子類更具備靈活性。
目標對象和線程徹底解耦:目標對象常常須要經過得到線程的名字(由於沒法得到線程對象的引用)以便肯定被JVM正在執行的線程是哪一個。
目標對象組合線程(弱耦合):目標對象能夠組合線程,目標對象類組合線程對象時,目標對象能夠經過得到線程對象的引用。
對於具備相同目標對象的線程,當其中一個線程享用CPU資源時,目標對象自動調用接口中的run方法,這時,run方法中的局部變量被分配內存空間,當輪到另外一個線程享用CPU資源時,目標對象會再次調用接口中的run方法,run()方法中的局部變量會再次分配內存空間。即run()方法已經啓動運行了兩次,分別運行在不一樣的線程中
start() : 線程調用該方法將啓動線程,使之重新建狀態進入就緒隊列排隊,一旦輪到它來享用CPU資源時,就能夠脫離建立它的線程獨立開始本身的生命週期了。
run(): Thread類的run()方法與Runnable接口中的run()方法的功能和做用相同,都用來定義線程對象被調度以後所執行的操做,都是系統自動調用而用戶程序不得引用的方法。
sleep(int millsecond): 優先級高的線程能夠在它的run()方法中調用sleep方法來使本身放棄CPU資源,休眠一段時間。
isAlive(): 線程處於「新建」狀態時,線程調用isAlive()方法返回false。在線程的run()方法結束以前,即沒有進入死亡狀態以前,線程調用isAlive()方法返回true。
currentThread(): 該方法是Thread類中的類方法,能夠用類名調用,該方法返回當前正在使用CPU資源的線程。
多個線程調用synchronized方法必須遵照同步機制。
在處理線程同步時,要作的第一件事就是要把修改數據的方法用關鍵字synchronized來修飾。
所謂線程同步就是若干個線程都須要使用一個synchronized修飾的方法。
線程同步機制:當一個線程A使用synchronized方法時,其餘線程想使用這個synchronized方法時就必須等待,直到線程A使用完該synchronized方法。
wait()方法能夠中斷方法的執行,使本線程等待,暫時讓出CPU的使用權,並容許其它線程使用這個同步方法。
notifyAll()方法通知全部的因爲使用這個同步方法而處於等待的線程結束等待。曾中斷的線程就會從剛纔的中斷處繼續執行這個同步方法,並遵循「先中斷先繼續」的原則。
notify()方法只是通知處於等待中的線程的某一個結束等待。
wait()、notify()、notifyAll()都是Object類中的final方法,被全部的類繼承且不容許重寫得方法。不能夠在非同步方法中使用wait()、notify()、notifyAll()。