掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
ExecutorService和Executors類實(shí)現(xiàn)。創(chuàng)建一個線程池實(shí)例,然后提交任務(wù)給線程池執(zhí)行。Java 是一種面向?qū)ο蟮木幊陶Z言,它提供了豐富的多線程支持,在 Java 中,線程是最小的程序執(zhí)行單元,它們可以共享進(jìn)程的資源,如內(nèi)存、文件等,使用線程可以提高程序的執(zhí)行效率,實(shí)現(xiàn)并發(fā)編程,本文將詳細(xì)介紹如何在 Java 中使用線程。

在 Java 中,有兩種創(chuàng)建線程的方式:一種是繼承 Thread 類,另一種是實(shí)現(xiàn) Runnable 接口。
1、繼承 Thread 類
通過繼承 Thread 類并重寫 run() 方法來創(chuàng)建線程,run() 方法是線程的主體,它將在調(diào)用 start() 方法后執(zhí)行。
class MyThread extends Thread {
@Override
public void run() {
// 線程要執(zhí)行的任務(wù)
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); // 啟動線程
}
}
2、實(shí)現(xiàn) Runnable 接口
通過實(shí)現(xiàn) Runnable 接口并重寫 run() 方法來創(chuàng)建線程,然后將實(shí)現(xiàn)了 Runnable 接口的類的實(shí)例作為參數(shù)傳遞給 Thread 類的構(gòu)造方法,最后調(diào)用 start() 方法啟動線程。
class MyRunnable implements Runnable {
@Override
public void run() {
// 線程要執(zhí)行的任務(wù)
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); // 啟動線程
}
}
Java 中的線程具有以下幾種狀態(tài):新建(New)、就緒(Runnable)、運(yùn)行(Running)、阻塞(Blocked)和死亡(Dead),線程的狀態(tài)可以通過 getState() 方法獲取。
1、sleep():讓線程休眠一段時間,單位為毫秒,當(dāng)休眠時間結(jié)束后,線程進(jìn)入就緒狀態(tài)。
2、wait():讓線程等待某個條件的發(fā)生,當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)其他線程調(diào)用該對象的 notify() 或 notifyAll() 方法時,線程進(jìn)入就緒狀態(tài)。
3、join():讓當(dāng)前線程等待另一個線程結(jié)束,當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)目標(biāo)線程結(jié)束時,當(dāng)前線程進(jìn)入就緒狀態(tài)。
4、interrupt():中斷線程的阻塞狀態(tài),使線程進(jìn)入就緒狀態(tài),注意,interrupt() 方法只是設(shè)置了一個中斷標(biāo)志,并不會真正地停止線程的執(zhí)行,需要程序員在適當(dāng)?shù)牡胤綑z查中斷標(biāo)志并處理中斷。
5、yield():讓當(dāng)前線程讓出 CPU 資源,進(jìn)入就緒狀態(tài),yield() 方法并不保證當(dāng)前線程一定會立即讓出 CPU 資源,它只是給當(dāng)前線程一個機(jī)會去競爭 CPU 資源。
在多線程環(huán)境下,多個線程可能會同時訪問共享資源,這可能導(dǎo)致數(shù)據(jù)不一致的問題,為了解決這個問題,可以使用同步機(jī)制來確保多個線程對共享資源的訪問是有序的,Java 提供了兩種同步機(jī)制:synchronized 關(guān)鍵字和 Lock 接口。
1、synchronized 關(guān)鍵字:可以用于修飾方法或者代碼塊,當(dāng)一個線程獲得了對象的鎖時,其他試圖訪問該對象的線程將被阻塞,直到鎖被釋放,synchronized 關(guān)鍵字可以保證同一時刻最多只有一個線程執(zhí)行該代碼塊或方法。
2、Lock 接口:提供了比 synchronized 關(guān)鍵字更靈活的鎖機(jī)制,Lock 接口的實(shí)現(xiàn)類(如 ReentrantLock)提供了 lock()、unlock()、tryLock() 等方法來控制鎖的獲取和釋放,使用 Lock 接口可以實(shí)現(xiàn)公平鎖、可重入鎖等功能。
為了避免頻繁地創(chuàng)建和銷毀線程,可以使用線程池來管理線程,Java 提供了兩種創(chuàng)建線程池的方式:ExecutorService 和 ThreadPoolExecutor。
1、ExecutorService:是一個接口,提供了 execute()、submit()、shutdown() 等方法來管理線程,常用的實(shí)現(xiàn)類有:FixedThreadPool、CachedThreadPool、ScheduledThreadPool。
2、ThreadPoolExecutor:是一個具體的類,提供了更多的配置選項(xiàng),如核心線程數(shù)、最大線程數(shù)、空閑線程存活時間等,可以通過自定義參數(shù)來創(chuàng)建線程池。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流