【011期】JavaSE面試題(十一):多線程(1)

開篇介紹

你們好,我是Java最全面試題庫提褲姐,今天這篇是JavaSE系列的第十一篇,主要總結了Java中的多線程問題,多線程分爲三篇來說,這篇是第一篇,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

線程和進程的區別?

進程:
具備必定獨立功能的程序關於某個數據集合上的一次運行活動,是操做系統進行資源分配和調度的一個獨立單位。面試

線程:
是進程的一個實體,是 cpu 調度和分派的基本單位,是比進程更小的能夠獨立運行的基本單位。編程

特色:緩存

  • 線程的劃分尺度小於進程,這使多線程程序擁有高併發性,
  • 進程在運行時各自內存單元相互獨立,線程之間內存共享,
  • 這使多線程編程能夠擁有更好的性能和用戶體驗
注意:多線程編程對於其它程序是不友好的,佔據大量 cpu 資源。

一個Java應用程序至少有幾個線程?

兩個:多線程

  • 主線程:負責main方法代碼的執行,
  • 垃圾回收器線程:負責了回收垃圾。

如何中止一個線程?

  • Thread.stop(),不建議使用
  • 經過一個變量去控制,當符合這個條件時,自動結束。
  • interrupt()

sleep() 和 wait() 有什麼區別?

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提供了哪幾種線程池?他們有什麼區別?

線程池能夠提升線程的建立和銷燬的開銷
jdk提供瞭如下幾種線程池:

  • new SingleThreadExecutor(單線程的線程池) 只有一個線程在執行,相對於單線程執行任務
  • new FixedThreadPool(固定線程數的線程池) 固定線程數處理任務;當任務過多,則固定的線程數誰先執行完任務,就執行剩餘任務
  • new ScheduledThreadPool(控制線程池定時週期任務執行)
  • new CachedThreadPool(可緩存的線程池)
通常工做中使用的是new ThreadPoolExecutor

說一下ThreadPoolExecutor各個參數的含義?

ThreadPoolExecutor(
    int corePoolSize, //核心線程池大小
    int maximumPoolSize, //最大線程池大小
    long keepAliveTime, //線程最大空閒時間
    TimeUnit unit, //時間單位
    BlockingQueue<Runnable> workQueue, //線程等待隊列
    ThreadFactory threadFactory, //線程建立工廠
    RejectedExecutionHandler handler  //拒絕策略
    ) {

說一下線程的生命週期?

線程的生命週期.png

  • 新建狀態(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()方法,該線程結束生命週期。

注意:就緒狀態是進入到運行狀態的惟一入口,也就是說,線程要想進入運行狀態執行,首先必須處於就緒狀態中;
相關文章
相關標籤/搜索