<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

java實現多線程的幾種方式

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

Java實現多線程的幾種方式

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

Java提供了多種實現多線程的方式,本文將詳細介紹以下幾種方式:

1.繼承Thread

2.實現Runnable接口

3.Callable和Future

4.線程池

5.Java 8中的CompletableFuture

一、繼承Thread類

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

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

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

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

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

二、實現Runnable接口

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

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

然后在主程序中創建線程對象,并將其作為參數傳遞給Thread類的構造函數。

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

使用實現Runnable接口的方式實現多線程更加靈活,因為在Java中可以實現多個接口。此外,通過將Runnable對象傳遞給Thread類,可以實現多個線程共享同一個Runnable對象的資源。

三、Callable和Future

Callable和Future是Java中另外一種實現多線程的方式,它可以獲取線程執行結果,并且可以在任務執行過程中取消任務。

Callable接口類似于Runnable接口,不同之處在于,Callable接口的call()方法可以返回一個結果,而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類來獲取線程執行結果,FutureTask是Future接口的實現類。通過調用get()方法可以獲取線程的返回結果,如果線程還未執行完畢,get()方法將會阻塞等待。

四、線程池

在真實的應用程序中,創建大量的線程會消耗大量的系統資源,降低程序的性能。Java提供了線程池來管理和復用線程,從而改善性能。

使用線程池可以通過以下步驟實現多線程:

1. 創建線程池對象

2. 創建任務對象

3. 將任務提交給線程池執行

```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()) {
// 等待所有任務完成
}

System.out.println("所有任務已經完成");
}
}

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類的靜態方法Executors.newFixedThreadPool(5)創建一個具有5個線程的線程池。然后循環創建Runnable對象并提交給線程池執行。

最后,調用shutdown()方法關閉線程池,并等待所有任務完成。

五、Java 8中的CompletableFuture

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

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

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

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

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

在這個例子中,CompletableFuture.supplyAsync()方法接收一個Supplier函數,返回一個CompletableFuture對象,表示異步操作的結果。然后調用thenAccept()方法來處理結果??梢岳^續鏈式調用多個方法來處理結果。

最后,調用join()方法等待異步任務完成。

總結:

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

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

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

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

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

通過合理地選擇和使用多線程的方式,可以提高程序的效率和性能,充分發揮多核處理器的優勢,實現更高效的任務處理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2908

    瀏覽量

    103134
  • 多線程
    +關注

    關注

    0

    文章

    271

    瀏覽量

    19748
  • 線程池
    +關注

    關注

    0

    文章

    53

    瀏覽量

    6778
收藏 人收藏

    評論

    相關推薦

    AT socket可以多線程調用嗎?

    請問AT socket 可以多線程調用嗎? 有互鎖機制嗎,還是要自己做互鎖。
    發表于 03-01 08:22

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

    Redis是一種使用C語言編寫的高性能鍵值存儲系統,它是單線程的,因為使用了多路復用的方式來處理并發請求。這樣的實現方式帶來了很好的性能,但同時也引發了一些
    的頭像 發表于 12-05 10:28 ?754次閱讀

    線程池的創建方式幾種

    的開銷。線程池的創建方式有多種,下面將詳細介紹幾種常用的線程池創建方式。 手動創建線程池 手動創
    的頭像 發表于 12-04 16:52 ?460次閱讀

    mfc多線程編程實例

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

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發數據同步的問題,即保證多個
    的頭像 發表于 11-17 14:22 ?407次閱讀

    多線程并發查詢oracle數據庫

    數據庫的原理、使用場景、實現方法以及可能遇到的問題和解決方案。 一、多線程并發查詢的原理 在傳統的單線程查詢方式中,當一個查詢請求發起時,數據庫會按照順序執行查詢語句并返回結果。如果查
    的頭像 發表于 11-17 14:22 ?1877次閱讀

    多線程同步的幾種方法

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

    多線程idm下載軟件

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

    請問單片機怎么實現真正的多線程?

    單片機怎么實現真正的多線程??
    發表于 10-18 06:45

    Java中的線程池包括哪些

    java.util.concurrent 包來實現的,最主要的就是 ThreadPoolExecutor 類。 Executor: 代表線程池的接口,有一個 execute() 方法,給一個 Runnable 類型對象
    的頭像 發表于 10-11 15:33 ?587次閱讀
    <b class='flag-5'>Java</b>中的<b class='flag-5'>線程</b>池包括哪些

    MDK可以支持多線程編譯嗎?

    怎么才能打開多線程編譯
    發表于 10-11 07:23

    Java多線程的用法

    能力。 什么是進程 是指正在運行的程序的實例。 每個進程都擁有自己的內存空間、代碼、數據和文件等資源,可以獨立運行、調度和管理。在操作系統中,進程是系統資源分配的最小單位,是實現多任務的基礎。 Java多線程
    的頭像 發表于 09-30 17:07 ?680次閱讀

    Rust的多線程編程概念和使用方法

    和字段、常見用法以及多線程的一些實踐經驗。由淺入深帶你零基礎玩轉Rust的多線程編程。 線程的基本概念和使用方法 Thread是Rust中并發編程的一種基本方式。Rust中的Threa
    的頭像 發表于 09-20 11:15 ?556次閱讀

    labview AMC多線程

    labview_AMC多線程
    發表于 08-21 10:31 ?23次下載

    多線程事務怎么回滾?一個簡單示例演示多線程事務

    在spring中可以使用@Transactional注解去控制事務,使出現異常時會進行回滾,在多線程中,這個注解則不會生效,如果主線程需要先執行一些修改數據庫的操作,當子線程在進行處理出現異常時,主
    發表于 08-09 12:22 ?408次閱讀
    <b class='flag-5'>多線程</b>事務怎么回滾?一個簡單示例演示<b class='flag-5'>多線程</b>事務
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>