【Java面試題-基礎知識03】Java線程連環問

1、Java中的線程是什麼?

在Java中,線程是程序執行流的最小單元。每個Java程序都至少有一個主線程,也稱爲主執行線程,它是程序開始執行時自動創建的。除了主線程外,程序員還可以創建額外的線程來執行併發任務。

2、創建線程的方式有哪些?

Java中的線程由java.lang.Thread類表示,可以通過兩種方式創建線程:

繼承Thread類:創建一個類並繼承Thread類,在該類中重寫run()方法,並在其中定義線程執行的任務。然後通過創建該類的對象並調用start()方法來啓動線程。

class MyThread extends Thread {
    public void run() {
        // 線程執行的任務
    }
}


public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 啓動線程
    }
}

 

實現Runnable接口:創建一個類實現Runnable接口,在該類中實現run()方法,並在其中定義線程執行的任務。然後通過創建該類的對象,並將其傳遞給Thread類的構造函數來創建線程,最後調用start()方法啓動線程。

class MyRunnable implements Runnable {
    public void run() {
        // 線程執行的任務
    }
}


public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start(); // 啓動線程
    }
}

 

3、上述兩種方式的優缺點? 

繼承 Thread 類:
優點:
簡單直觀:直接繼承 Thread 類,重寫 run() 方法,代碼比較簡單,易於理解。
缺點:
類型侷限性:Java是單繼承的語言,如果已經繼承了其他類,則無法再繼承 Thread 類,限制了類的擴展性。
不利於共享資源:由於線程類已經繼承了 Thread,無法再繼承其他類,因此不利於多個線程之間共享資源。

實現 Runnable 接口:
優點:
避免單繼承侷限性:通過實現 Runnable 接口,可以避免單繼承的限制,允許類繼續繼承其他類。
支持共享資源:由於不是繼承線程類,因此可以將多個線程共享的資源放在實現 Runnable 接口的類中,更容易實現資源共享。
缺點:
略微複雜:相比於繼承 Thread 類,實現 Runnable 接口稍微複雜一些,需要創建一個實現 Runnable 接口的類,並將其傳遞給 Thread 類。

一般情況下推薦使用實現 Runnable 接口的方式創建線程,因爲它更靈活,可以避免單繼承的限制,同時支持共享資源,更符合面向對象設計的原則。

4、什麼是Java線程池?

Java線程池是一種用於管理和複用線程的機制,它可以在執行大量異步任務時提供性能的提升。使用線程池可以避免不斷創建和銷燬線程所帶來的性能開銷,並能更好地控制資源的使用情況。

5、如何創建Java線程池?

在 Java 中創建線程池通常通過 java.util.concurrent.Executors 類中的靜態工廠方法來實現。

創建固定大小的線程池:

// 創建固定大小爲 5 的線程池
ExecutorService executor = Executors.newFixedThreadPool(5);

創建單線程的線程池:

ExecutorService executor = Executors.newSingleThreadExecutor();
創建可緩存的線程池:

// 創建可緩存的線程池,線程數會根據需要自動增加或減少
ExecutorService executor = Executors.newCachedThreadPool();

創建定時執行任務的線程池:

// 創建定時執行任務的線程池,參數爲核心線程數
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);


6、你用到過線程池的哪些參數?
線程池的參數通常取決於你在創建線程池時選擇的具體實現和配置。一般來說,線程池的參數可以包括以下幾個方面:

a. 核心線程數(Core Pool Size):這是線程池中的基本線程數量,即使它們處於空閒狀態也會保持活動狀態。當有新任務提交時,線程池會優先使用核心線程來執行任務。

b. 最大線程數(Maximum Pool Size):這是線程池中允許的最大線程數量。如果核心線程已經全部被佔用,而且任務隊列也已滿,那麼新任務就會創建額外的線程,直到達到最大線程數爲止。超出最大線程數的任務將根據線程池的策略被拒絕執行。

c. 任務隊列(Task Queue):任務隊列用於存儲提交但尚未執行的任務。當所有核心線程都處於忙碌狀態時,新任務將被放置在任務隊列中等待執行。任務隊列的類型可以是有界隊列,如`ArrayBlockingQueue`,也可以是無界隊列,如`LinkedBlockingQueue`。

d. 線程存活時間(Keep Alive Time):當線程池中的線程數量超過核心線程數時,多餘的空閒線程在經過一定時間後會被終止並從線程池中移除,以減少資源消耗。這個時間段即爲線程的存活時間。

e. 拒絕策略(Rejected Execution Policy):當任務無法被線程池執行時的處理策略。常見的策略包括拋出異常、丟棄任務、丟棄最舊的任務、或者由調用線程執行任務等。

這些是線程池中常見的參數,你可以根據具體的需求來配置線程池以達到最佳的性能和資源利用率。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章