天天看點

線程相關面試題

1.線程程序的差別

具體例子: 打開網易雲,相當于打開一個程序, 點選播放音樂, 就相當于建立了一個線程, 點選下載下傳, 相當于又建立了一個線程, 我們再去打開QQ, 就是又打開了一個程序, 總結: 線程是程序的子關系。

具體對比:

程序 線程
資源配置設定的最小機關 系統排程的最小機關
有獨立空間,互相之間是隔離的 沒有獨立空間, 同一個程序下的線程共享記憶體空間
一個程序有多個線程 一個線程隸屬于一個程序
建立時消耗大,打開一個應用當然大 消耗小, 讓作業系統去fork()一個線程

2.線程阻塞和等待的差別_什麼導緻線程阻塞?

阻塞: 指的是暫停一個線程的執行以等待某個條件發生(如某資源就緒)

調用sleep()方法後就會處于阻塞狀态,不會釋放cpu資源, 也不會釋放鎖,等時間到了, 又進入就緒狀态。

等待: 和阻塞類似, 但是它會釋放CPU, 釋放鎖, 調用wait()方法,等待用notify()和notifyAll()方法去喚醒它, 然後進入等待序列。

3.同步異步的差別

同步是所有的操作都做完,才傳回給使用者結果;即寫完資料庫之後,再響應使用者,使用者體驗不好。而異步不用等所有操作都做完,就相應使用者請求;即先響應使用者請求,然後慢慢去寫資料庫,使用者體驗較好。”

4.JAVA建立線程的四種方式

繼承Thread類建立線程

實作Runnable接口建立線程

使用Callable和Future建立線程

使用線程池例如用Executor架構

callable和future

public static class MyCallAble implements Callable{
        int i = 0;
        @Override
        public Object call() throws Exception {
            System.out.println(Thread.currentThread().getName() + ": i = " + (i++));
            return i;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable callable = new MyCallAble();
        for (int i = 0; i < 1000; i++) {
            FutureTask futureTask = new FutureTask(callable);
            new Thread(futureTask, "子線程" + i).run();
            System.out.println(futureTask.get());
        }
    }
           

線程池的方法, 這裡是線程池的構造函數

public ThreadPoolExecutor(int corePoolSize, //核心線程數
                              int maximumPoolSize, //線程池最大線程數
                              long keepAliveTime, //線程池空閑時線程的存活時長;
                              TimeUnit unit,//線程存活時長大機關,結合上個參數使用;
                              BlockingQueue<Runnable> workQueue) { //存放任務的隊列,使用的是阻塞隊列;
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
           

除了上面5個以外, 還有兩個參數

threadFactory:線程池建立線程的工廠;

handler:在隊列(workQueue)和線程池達到最大線程數(maximumPoolSize)均滿時仍有任務的情況下的處理方式;

5.線程池的相關知識

線程池處理流程

線程相關面試題

4種拒絕政策

1.當觸發拒絕政策時,隻要線程池沒有關閉,就由送出任務的目前線程處理

2.當觸發拒絕政策時,直接抛出拒絕執行的異常,中止政策的意思也就是打斷目前執行流程

3.直接靜悄悄的丢棄這個任務,不觸發任何動作

4.如果線程池未關閉,就彈出隊列頭部的元素,然後嘗試執行

6.sleep(), wait(), jion(), yield()

sleep(): 進入阻塞狀态, 但是不釋放鎖和cpu資源, 等待時間到了又進入就緒狀态

wait(): 釋放鎖和cpu資源, 等待notify和notifyAll喚醒進入等待隊列。

jion(): 如t.jion(), 代表主線程将執行權交給t, t執行完了以後在繼續執行

yield():釋放cpu但不釋放執行權。

繼續閱讀