你們好,我是Java最全面試題庫
的提褲姐
,今天這篇是JavaSE
系列的第十一篇,主要總結了Java中的多線程
問題,多線程分爲三篇來說,這篇是第一篇,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
進程:
具備必定獨立功能的程序關於某個數據集合上的一次運行活動,是操做系統進行資源分配和調度的一個獨立單位。面試
線程:
是進程的一個實體,是 cpu 調度和分派的基本單位,是比進程更小的能夠獨立運行的基本單位。編程
特色:緩存
注意:多線程編程對於其它程序是不友好的,佔據大量 cpu 資源。
兩個:多線程
主線程
:負責main方法代碼的執行,垃圾回收器線程
:負責了回收垃圾。sleep()方法:Thread類中的靜態方法
,
當一個線程調用sleep()方法之後,不會釋放
同步資源鎖,其餘線程仍然會等待資源鎖的釋放。併發
wait()方法:Object類提供的一個普通方法
,
並且必須同同步資源鎖對象在同步代碼塊或者同步方法中調用。
當調用wait()方法後,當前線程會馬上釋放
掉同步鎖資源。其餘線程就有機會得到同步資源鎖從而繼續往下執行。ide
方式一:繼承Thread類建立線程類高併發
class T extends Thread{ @Override public void run() { } }
方式二:經過Runnable接口建立線程類性能
class T implements Runnable{ @Override public void run() { } }
方式三:經過Callable和Future建立線程spa
class T implements Callable<String> { @Override public String call() throws Exception { return null; } }
線程池能夠提升線程的建立和銷燬的開銷
jdk提供瞭如下幾種線程池:
通常工做中使用的是new ThreadPoolExecutor
ThreadPoolExecutor( int corePoolSize, //核心線程池大小 int maximumPoolSize, //最大線程池大小 long keepAliveTime, //線程最大空閒時間 TimeUnit unit, //時間單位 BlockingQueue<Runnable> workQueue, //線程等待隊列 ThreadFactory threadFactory, //線程建立工廠 RejectedExecutionHandler handler //拒絕策略 ) {
新建狀態(New)
:當線程對象對建立後,即進入了新建狀態,如:Thread thread= new MyThread();
就緒狀態(Runnable)
:當調用線程對象的start()方法(t.start();),線程即進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經作好了準備,隨時等待CPU調度執行,並非說執行了t.start()此線程當即就會執行;
運行狀態(Running)
:當CPU開始調度處於就緒狀態的線程時,此時線程才得以真正執行,即進入到運行狀態。
阻塞狀態(Blocked)
:處於運行狀態中的線程因爲某種緣由,暫時放棄對CPU的使用權,中止執行,此時進入阻塞狀態,直到其進入到就緒狀態,纔有機會再次被CPU調用以進入到運行狀態。根據阻塞產生的緣由不一樣,阻塞狀態又能夠分爲三種:
①等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態;
②同步阻塞:線程在獲取synchronized同步鎖失敗(由於鎖被其它線程所佔用),它會進入同步阻塞狀態;
③其餘阻塞:經過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態。
死亡狀態(Dead)
:線程執行完了或者因異常退出了run()方法,該線程結束生命週期。
注意:就緒狀態是進入到運行狀態的惟一入口,也就是說,線程要想進入運行狀態執行,首先必須處於就緒狀態中;