Java多線程是Java語言中的一項重要特性。多線程允許程序並發執行多個任務,讓程序能夠更高效地利用計算資源和提高相應速度。本文將從多個方面闡述Java多線程基礎,包括線程創建、狀態轉換、同步與鎖、線程池等。
一、線程創建
Java多線程的創建有兩種方式:繼承Thread類和實現Runnable介面。推薦使用實現Runnable介面的方式,因為這種方式可以更好地遵循面向對象設計原則,以及可以避免Java不支持多重繼承的問題。
1. 繼承Thread類
public class MyThread extends Thread { public void run() { // 這裡放置線程需要執行的代碼 } } // 創建線程實例並啟動 MyThread myThread = new MyThread(); myThread.start();
上述代碼定義了一個線程類MyThread,重寫了父類Thread中的run()方法,該方法中存放了線程需要執行的方法。創建線程實例後,調用start()方法啟動線程。需要注意的是,直接調用run()方法不會啟動一個新的線程,而是在當前線程中執行run()方法。
2. 實現Runnable介面
public class MyRunnable implements Runnable { public void run() { // 這裡放置線程需要執行的代碼 } } // 創建線程實例並啟動 MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start();
上述代碼定義了一個實現了Runnable介面的線程類MyRunnable。創建線程實例時,傳入實例化的MyRunnable對象,並調用該線程的start()方法啟動線程。
二、線程狀態轉換
線程在執行的過程中會發生狀態,常見的狀態有5種:新建狀態、可運行狀態、阻塞狀態、等待狀態、終止狀態。線程狀態轉換如下:
1. 線程狀態獲取
線程狀態可以使用getState()方法獲得。該方法返回一個Thread.State枚舉值,該枚舉中定義了線程的所有狀態。示例代碼如下:
Thread thread = new Thread(() -> { // 執行任務 }); thread.start(); Thread.State state = thread.getState(); // 獲取線程狀態
2. 線程狀態轉換演示
通過以下代碼,可以演示線程狀態的轉換過程:
public class ThreadDemo { public static void main(String[] args) throws Exception { Thread t = new Thread(() -> { System.out.println(Thread.currentThread().getName()+"線程已啟動"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"線程已結束"); }); System.out.println(t.getName()+" 線程狀態:"+t.getState()); // NEW t.start(); System.out.println(t.getName()+" 線程狀態:"+t.getState()); // RUNNABLE Thread.sleep(500); System.out.println(t.getName()+" 線程狀態:"+t.getState()); // TIMED_WAITING Thread.sleep(1000); System.out.println(t.getName()+" 線程狀態:"+t.getState()); // TERMINATED } }
運行結果:
Thread-0 線程狀態:NEW Thread-0 線程狀態:RUNNABLE Thread-0 線程狀態:TIMED_WAITING Thread-0 線程狀態:TERMINATED
三、同步與鎖
在多線程運行中,可能存在多個線程同時訪問共享資源的情況,會導致數據不一致的問題。為了避免這種情況,需要使用同步與鎖機制。
1. synchronized同步
synchronized是一種保證線程安全的機制,它可以修飾方法和代碼塊。在方法上添加synchronized關鍵字,可以實現對整個方法的同步。
public synchronized void synchronizedMethod() { // synchronize方法體 }
在代碼塊上添加synchronized關鍵字,可以實現對指定代碼塊的同步。
public void method(){ synchronized(this){ // synchronize代碼塊 } }
2. Lock鎖機制
Lock是JDK提供的另一種線程同步機制,相比synchronized,Lock鎖更加靈活,能夠實現更細粒度的鎖定。一個Lock鎖可以同時被多個線程持有,線程使用完後必須釋放鎖。
Lock lock = new ReentrantLock(); lock.lock(); // 上鎖 try { // lock代碼塊 } finally { lock.unlock(); // 釋放鎖 }
四、線程池
在進行多線程編程時,經常使用線程池來提高執行效率。Java語言提供了線程池的支持,可以充分利用CPU,提高程序的執行效率。
1. ThreadPoolExecutor
ThreadPoolExecutor是Java中的線程池實現,它可以自動管理和調度線程,並且可以實現線程池定製化,非常靈活。以下是ThreadPoolExecutor的構造函數:
ThreadPoolExecutor( int corePoolSize, // 線程池中核心線程數 int maximumPoolSize, // 線程池中最大線程數 long keepAliveTime, // 非核心線程空閑時間 TimeUnit unit, // keepAliveTime的單位 BlockingQueue workQueue, // 任務隊列 ThreadFactory threadFactory, // 線程工廠 RejectedExecutionHandler handler // 任務被拒絕時的處理方式 )
2. 線程池示例
以下代碼演示了如何使用線程池實現多線程:
ExecutorService executorService = Executors.newFixedThreadPool(5); for(int i = 0; i { // 執行任務 }); } executorService.shutdown();
以上代碼創建了一個FixedThreadPool類型的線程池,指定了線程池中核心線程數為5,最大線程數為5,當線程空閑時間達到1秒時,非核心線程將被回收。線程池接受10個任務,通過execute()方法執行任務,線程池在執行完任務後將被關閉。
總結
本文介紹了Java多線程的基礎知識,包括線程的創建、狀態轉換、同步與鎖、線程池等方面。通過學習和實踐,可以更好地掌握Java多線程編程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237472.html