0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

java實(shí)現(xiàn)多線程的幾種方式

工程師鄧生 ? 來源:未知 ? 作者:劉芹 ? 2024-03-14 16:55 ? 次閱讀

Java實(shí)現(xiàn)多線程的幾種方式

多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序的效率和性能,使得程序可以同時處理多個任務(wù)。

Java提供了多種實(shí)現(xiàn)多線程的方式,本文將詳細(xì)介紹以下幾種方式:

1.繼承Thread

2.實(shí)現(xiàn)Runnable接口

3.Callable和Future

4.線程池

5.Java 8中的CompletableFuture

一、繼承Thread類

繼承Thread類是實(shí)現(xiàn)多線程的最基本方式,只需創(chuàng)建一個類并繼承Thread類,重寫run()方法即可。

```java
public class MyThread extends Thread {
@Override
public void run() {
// 線程要執(zhí)行的任務(wù)
System.out.println("Hello, World!");
}
}
```

然后在主程序中創(chuàng)建線程對象并調(diào)用start()方法啟動線程。

```java
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
```

這種方式實(shí)現(xiàn)多線程比較簡單,但是由于Java只支持單繼承,所以如果已經(jīng)繼承了其他類就不能再繼承Thread類了。

二、實(shí)現(xiàn)Runnable接口

實(shí)現(xiàn)Runnable接口是Java中另一種實(shí)現(xiàn)多線程的方式,也是最常用的方式。同樣地,需要創(chuàng)建一個類并實(shí)現(xiàn)Runnable接口,重寫run()方法。

```java
public class MyRunnable implements Runnable {
@Override
public void run() {
// 線程要執(zhí)行的任務(wù)
System.out.println("Hello, World!");
}
}
```

然后在主程序中創(chuàng)建線程對象,并將其作為參數(shù)傳遞給Thread類的構(gòu)造函數(shù)。

```java
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
```

使用實(shí)現(xiàn)Runnable接口的方式實(shí)現(xiàn)多線程更加靈活,因?yàn)樵贘ava中可以實(shí)現(xiàn)多個接口。此外,通過將Runnable對象傳遞給Thread類,可以實(shí)現(xiàn)多個線程共享同一個Runnable對象的資源。

三、Callable和Future

Callable和Future是Java中另外一種實(shí)現(xiàn)多線程的方式,它可以獲取線程執(zhí)行結(jié)果,并且可以在任務(wù)執(zhí)行過程中取消任務(wù)。

Callable接口類似于Runnable接口,不同之處在于,Callable接口的call()方法可以返回一個結(jié)果,而Runnable接口的run()方法沒有返回值。

```java
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MyCallable implements Callable {
@Override
public String call() throws Exception {
Thread.sleep(2000); // 模擬耗時操作
return "Hello, World!";
}
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable callable = new MyCallable();
FutureTask futureTask = new FutureTask<>(callable);

Thread thread = new Thread(futureTask);
thread.start();

String result = futureTask.get();
System.out.println(result);
}
```

這種方式使用了FutureTask類來獲取線程執(zhí)行結(jié)果,F(xiàn)utureTask是Future接口的實(shí)現(xiàn)類。通過調(diào)用get()方法可以獲取線程的返回結(jié)果,如果線程還未執(zhí)行完畢,get()方法將會阻塞等待。

四、線程池

在真實(shí)的應(yīng)用程序中,創(chuàng)建大量的線程會消耗大量的系統(tǒng)資源,降低程序的性能。Java提供了線程池來管理和復(fù)用線程,從而改善性能。

使用線程池可以通過以下步驟實(shí)現(xiàn)多線程:

1. 創(chuàng)建線程池對象

2. 創(chuàng)建任務(wù)對象

3. 將任務(wù)提交給線程池執(zhí)行

```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executorService.execute(worker);
}

executorService.shutdown();

while (!executorService.isTerminated()) {
// 等待所有任務(wù)完成
}

System.out.println("所有任務(wù)已經(jīng)完成");
}
}

class WorkerThread implements Runnable {
private String message;

public WorkerThread(String message) {
this.message = message;
}

@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " (Start) message = " + message);
processMessage();
System.out.println(Thread.currentThread().getName() + " (End)");
}

private void processMessage() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```

這里通過ExecutorService類的靜態(tài)方法Executors.newFixedThreadPool(5)創(chuàng)建一個具有5個線程的線程池。然后循環(huán)創(chuàng)建Runnable對象并提交給線程池執(zhí)行。

最后,調(diào)用shutdown()方法關(guān)閉線程池,并等待所有任務(wù)完成。

五、Java 8中的CompletableFuture

Java 8引入了CompletableFuture類來簡化異步編程和多線程開發(fā)。CompletableFuture類提供了豐富的方法來處理任務(wù)。

```java
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
// 線程要執(zhí)行的任務(wù)
return "Hello, World!";
});

future.thenAccept(result -> {
System.out.println(result);
});

// 阻塞等待異步任務(wù)完成
future.join();
}
}
```

在這個例子中,CompletableFuture.supplyAsync()方法接收一個Supplier函數(shù),返回一個CompletableFuture對象,表示異步操作的結(jié)果。然后調(diào)用thenAccept()方法來處理結(jié)果。可以繼續(xù)鏈?zhǔn)秸{(diào)用多個方法來處理結(jié)果。

最后,調(diào)用join()方法等待異步任務(wù)完成。

總結(jié):

Java提供了多種實(shí)現(xiàn)多線程的方式,每種方式都有其適用的場景。上述介紹的五種方式包含了最常見的實(shí)現(xiàn)多線程的方法,它們可以根據(jù)不同的需求來選擇和使用。

1. 繼承Thread類和實(shí)現(xiàn)Runnable接口是最基本、最常用的實(shí)現(xiàn)多線程的方式,它們相對簡單,適用于簡單的多線程任務(wù)。

2. Callable和Future接口適用于需要獲取線程執(zhí)行結(jié)果的場景,同時可以控制任務(wù)的取消。

3. 線程池適用于大量、重復(fù)的任務(wù)執(zhí)行場景,可以提高程序的效率和性能。

4. CompletableFuture是Java 8新增的類,充分利用了Lambda表達(dá)式和流式操作的特性,使用相對簡單。

通過合理地選擇和使用多線程的方式,可以提高程序的效率和性能,充分發(fā)揮多核處理器的優(yōu)勢,實(shí)現(xiàn)更高效的任務(wù)處理。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104362
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    276

    瀏覽量

    19878
  • 線程池
    +關(guān)注

    關(guān)注

    0

    文章

    55

    瀏覽量

    6820
收藏 人收藏

    評論

    相關(guān)推薦

    多線程設(shè)計模式到對 CompletableFuture 的應(yīng)用

    最近在開發(fā) 延保服務(wù) 頻道頁時,為了提高查詢效率,使用到了多線程技術(shù)。為了對多線程方案設(shè)計有更加充分的了解,在業(yè)余時間讀完了《圖解 Java 多線程設(shè)計模式》這本書,覺得收獲良多。本篇
    的頭像 發(fā)表于 06-26 14:18 ?217次閱讀
    從<b class='flag-5'>多線程</b>設(shè)計模式到對 CompletableFuture 的應(yīng)用

    探索虛擬線程:原理與實(shí)現(xiàn)

    虛擬線程的引入與優(yōu)勢 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)中的線程是通過java.lang.Thread類型來實(shí)現(xiàn)的,這些
    的頭像 發(fā)表于 06-24 11:35 ?233次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與<b class='flag-5'>實(shí)現(xiàn)</b>

    AT socket可以多線程調(diào)用嗎?

    請問AT socket 可以多線程調(diào)用嗎? 有互鎖機(jī)制嗎,還是要自己做互鎖。
    發(fā)表于 03-01 08:22

    你還是分不清多進(jìn)程和多線程嗎?一文搞懂!

    你還是分不清多進(jìn)程和多線程嗎?一文搞懂! 多進(jìn)程和多線程是并發(fā)編程中常見的兩個概念,它們都可以用于提高程序的性能和效率。但是它們的實(shí)現(xiàn)方式和使用場景略有不同。 1. 多進(jìn)程: 多進(jìn)程指
    的頭像 發(fā)表于 12-19 16:07 ?490次閱讀

    redis多線程還能保證線程安全嗎

    Redis是一種使用C語言編寫的高性能鍵值存儲系統(tǒng),它是單線程的,因?yàn)槭褂昧硕嗦窂?fù)用的方式來處理并發(fā)請求。這樣的實(shí)現(xiàn)方式帶來了很好的性能,但同時也引發(fā)了一些
    的頭像 發(fā)表于 12-05 10:28 ?1509次閱讀

    線程池的創(chuàng)建方式幾種

    的開銷。線程池的創(chuàng)建方式有多種,下面將詳細(xì)介紹幾種常用的線程池創(chuàng)建方式。 手動創(chuàng)建線程池 手動創(chuàng)
    的頭像 發(fā)表于 12-04 16:52 ?747次閱讀

    mfc多線程編程實(shí)例

    (圖形用戶界面)應(yīng)用程序的開發(fā)。在這篇文章中,我們將重點(diǎn)介紹MFC中的多線程編程。 多線程編程在軟件開發(fā)中非常重要,它可以實(shí)現(xiàn)程序的并發(fā)執(zhí)行,提高程序的效率和響應(yīng)速度。MFC提供了豐富的多線程
    的頭像 發(fā)表于 12-01 14:29 ?1293次閱讀

    多線程如何保證數(shù)據(jù)的同步

    多線程編程是一種并發(fā)編程的方法,意味著程序中同時運(yùn)行多個線程,每個線程可獨(dú)立執(zhí)行不同的任務(wù),共享同一份數(shù)據(jù)。由于多線程并發(fā)執(zhí)行的特點(diǎn),會引發(fā)數(shù)據(jù)同步的問題,即保證多個
    的頭像 發(fā)表于 11-17 14:22 ?1015次閱讀

    多線程并發(fā)查詢oracle數(shù)據(jù)庫

    數(shù)據(jù)庫的原理、使用場景、實(shí)現(xiàn)方法以及可能遇到的問題和解決方案。 一、多線程并發(fā)查詢的原理 在傳統(tǒng)的單線程查詢方式中,當(dāng)一個查詢請求發(fā)起時,數(shù)據(jù)庫會按照順序執(zhí)行查詢語句并返回結(jié)果。如果查
    的頭像 發(fā)表于 11-17 14:22 ?3377次閱讀

    多線程同步的幾種方法

    多線程同步是指在多個線程并發(fā)執(zhí)行的情況下,為了保證線程執(zhí)行的正確性和一致性,需要采用特定的方法來協(xié)調(diào)線程之間的執(zhí)行順序和共享資源的訪問。下面將介紹
    的頭像 發(fā)表于 11-17 14:16 ?1041次閱讀

    Linux系統(tǒng)上多線程和多進(jìn)程的運(yùn)行效率

    關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這么簡單了,選的不好,會讓你
    的頭像 發(fā)表于 11-10 10:54 ?1216次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和多進(jìn)程的運(yùn)行效率

    基于DSP/BIOS多線程的小型組合導(dǎo)航系統(tǒng)設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于DSP/BIOS多線程的小型組合導(dǎo)航系統(tǒng)設(shè)計.pdf》資料免費(fèi)下載
    發(fā)表于 11-08 10:07 ?0次下載
    基于DSP/BIOS<b class='flag-5'>多線程</b>的小型組合導(dǎo)航系統(tǒng)設(shè)計

    關(guān)于Python多進(jìn)程和多線程詳解

    進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。
    的頭像 發(fā)表于 11-06 14:46 ?744次閱讀
    關(guān)于Python多進(jìn)程和<b class='flag-5'>多線程</b>詳解

    如何使用pthread_barrier_xxx系列函數(shù)來實(shí)現(xiàn)多線程之間的同步?

    在Linux系統(tǒng)中提供了多種同步機(jī)制,本文主要講講如何使用pthread_barrier_xxx系列函數(shù)來實(shí)現(xiàn)多線程之間進(jìn)行同步的方法。
    的頭像 發(fā)表于 10-23 14:43 ?865次閱讀
    如何使用pthread_barrier_xxx系列函數(shù)來<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>多線程</b>之間的同步?

    多線程idm下載軟件

    多線程idm下載軟件
    發(fā)表于 10-23 09:23 ?0次下載