国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

掌握這五種多線程方法,提高Java代碼效率

開發
適當地使用這些下面這些方法,可以徹底改變您的應用程序,并推動您的職業發展。下面我們來看看如何將您的應用程序轉變為高效的多線程應用。

如果您的應用程序與那些能夠同時處理多個任務的應用程序相比表現不佳,很可能是因為它是單線程的。解決這個問題的方法之一是采用多線程技術。

以下是一些可以考慮的方法:

  • 線程(Thread)
  • 并行流(Parallel Streams)
  • ExecutorService
  • ForkJoinPool
  • CompletableFuture

適當地使用這些方法,可以徹底改變您的應用程序,并推動您的職業發展。下面我們來看看如何將您的應用程序轉變為高效的多線程應用。

1. 線程(Thread)

第一種選擇是使用線程(Thread)類。通過這種方式,您可以直接控制線程的創建和管理。以下是一個示例:

CustomTask 每隔50毫秒從0數到 count - 1。

public class CustomTask implements Runnable {
    private final String name;
    private final int count;

    CustomTask(String name, int count) {
        this.name = name;
        this.count = count;
    }

    @Override
    public void run() {
        for (int i = 0; i < count; i++) {
            System.out.println(name + "-" + i + " from " +
                    Thread.currentThread().getName());
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

a、b 和 c 是該類的三個實例。

Thread a = new Thread(new CustomTask("a", 5));
Thread b = new Thread(new CustomTask("b", 10));
Thread c = new Thread(new CustomTask("c", 5));

請注意,b 預計計數的次數是其他實例的兩倍。您希望在 a 和 c 順序運行的同時運行 b。

您可以非常容易地實現這種行為。

// 首先啟動 a 和 b。
a.start();
b.start();

//  a 完成后開始 c。
a.join();
c.start();

以下是結果:

a-0 from Thread-0
b-0 from Thread-1
b-1 from Thread-1
a-1 from Thread-0
b-2 from Thread-1
a-2 from Thread-0
b-3 from Thread-1
a-3 from Thread-0
b-4 from Thread-1
a-4 from Thread-0
b-5 from Thread-1
c-0 from Thread-2
b-6 from Thread-1
c-1 from Thread-2
b-7 from Thread-1
c-2 from Thread-2
b-8 from Thread-1
c-3 from Thread-2
b-9 from Thread-1
c-4 from Thread-2

a 和 b 同時開始運行,輪流輸出。a 完成后,c 開始執行。此外,它們全部在不同的線程中運行。通過手動創建 Thread 實例,您可以完全控制它們。

然而,請注意,低級線程處理也需要同步和資源管理,這可能更容易出錯和復雜。

2. 并行流(Parallel Streams)

當您需要對大型集合中的所有元素應用相同、重復且獨立的任務時,并行流非常有效。

例如,圖像調整大小是一個需要按順序運行的繁重任務;當您有多個圖像需要調整大小時,如果按順序執行,將需要很長時間才能完成。在這種情況下,您可以使用并行流并行調整它們的大小,如下所示。

private static List<BufferedImage> resizeAll(List<BufferedImage> sourceImages,
                                             int width, int height) {
    return sourceImages
            .parallelStream()
            .map(source -> resize(source, width, height))
            .toList();
}

這樣,圖像將同時調整大小,節省了大量寶貴的時間。

3. ExecutorService

當實現不需要精確的線程控制時,可以考慮使用 ExecutorService。ExecutorService 提供了更高層次的線程管理抽象,包括線程池、任務調度和資源管理。

ExecutorService 是一個接口,它最常見的用法是線程池。假設您有大量的異步任務堆積在一起,但是同時運行所有任務——每個任務占用一個線程——似乎太多了。線程池可以通過限制最大線程數來幫助您。

下面的示例中,我們使用 Executors.newFixedThreadPool() 實例化 ExecutorService 來使用 3 個線程運行 10 個任務。每個任務只打印一行。請注意,我們在之前的部分中重用了之前定義的 CustomTask。

ExecutorService executorService = Executors.newFixedThreadPool(3);

for (int i = 0; i < 10; i++) {
    executorService.submit(new CustomTask(String.valueOf(i), 1));
}

executorService.shutdown();

這將打印以下結果:

0-0 from pool-1-thread-1
2-0 from pool-1-thread-3
1-0 from pool-1-thread-2
4-0 from pool-1-thread-3
3-0 from pool-1-thread-2
5-0 from pool-1-thread-1
6-0 from pool-1-thread-1
7-0 from pool-1-thread-3
8-0 from pool-1-thread-2
9-0 from pool-1-thread-3

10 個任務在 3 個線程中運行。通過限制特定任務使用的線程數,您可以根據優先級分配線程數:對于重要且頻繁的任務使用更多線程,對于瑣碎或偶爾的任務使用較少線程。ExecutorService 具有高效和簡潔的特點,是大多數多線程場景的首選選項。

如果您需要更多的控制和靈活性,請查看 ThreadPoolExecutor,它是 Executors.newFixedThreadPool() 返回的 ExecutorService 的實際實現。您可以直接創建其實例或將返回的 ExecutorService 實例轉換為 ThreadPoolExecutor 實例以獲得更多控制權。

4. ForkJoinPool

ForkJoinPool是另一種線程池,正如其名稱所示。雖然它在許多其他異步方法的底層使用中,但對于可以分解為較小且獨立子任務的任務來說,它也非常強大,這些任務可以通過分而治之的策略來解決。

其中一個任務是圖像調整大小。圖像調整大小是分而治之問題的一個很好的例子。使用ForkJoinPool,您可以將圖像分成兩個或四個較小的圖像,并同時調整它們的大小。以下是ImageResizeAction的示例,它將圖像調整為給定的大小。

package multithreading;

import java.awt.image.BufferedImage;
import java.util.concurrent.RecursiveAction;

public class ImageResizeAction extends RecursiveAction {
    private static final int THRESHOLD = 100;

    private final BufferedImage sourceImage;
    private final BufferedImage targetImage;
    private final int startRow;
    private final int endRow;
    private final int targetWidth;
    private final int targetHeight;

    public ImageResizeAction(BufferedImage sourceImage,
                             BufferedImage targetImage,
                             int startRow, int endRow,
                             int targetWidth, int targetHeight) {
        this.sourceImage = sourceImage;
        this.targetImage = targetImage;
        this.startRow = startRow;
        this.endRow = endRow;
        this.targetWidth = targetWidth;
        this.targetHeight = targetHeight;
    }

    @Override
    protected void compute() {
        if (endRow - startRow <= THRESHOLD) {
            resizeImage();
        } else {
            int midRow = startRow + (endRow - startRow) / 2;
            invokeAll(
                    new ImageResizeAction(sourceImage, targetImage,
                            startRow, midRow, targetWidth, targetHeight),
                    new ImageResizeAction(sourceImage, targetImage,
                            midRow, endRow, targetWidth, targetHeight)
            );
        }
    }

    private void resizeImage() {
        int sourceWidth = sourceImage.getWidth();
        double xScale = (double) targetWidth / sourceWidth;
        double yScale = (double) targetHeight / sourceImage.getHeight();

        for (int y = startRow; y < endRow; y++) {
            for (int x = 0; x < sourceWidth; x++) {
                int targetX = (int) (x * xScale);
                int targetY = (int) (y * yScale);
                int rgb = sourceImage.getRGB(x, y);
                targetImage.setRGB(targetX, targetY, rgb);
            }
        }
    }
}

請注意,ImageResizeAction繼承了RecursiveAction。RecursiveAction用于定義遞歸的調整大小操作。在此示例中,圖像被分成兩半并并行調整大小。

您可以使用以下代碼運行ImageResizeAction:

public static void main(String[] args) throws IOException {
    String sourceImagePath = "source_image.jpg";
    String targetImagePath = "target_image.png";
    int targetWidth = 300;
    int targetHeight = 100;

    BufferedImage sourceImage = ImageIO.read(new File(sourceImagePath));
    BufferedImage targetImage = new BufferedImage(targetWidth, targetHeight,
            BufferedImage.TYPE_INT_RGB);

    ForkJoinPool forkJoinPool = new ForkJoinPool();
    forkJoinPool.invoke(new ImageResizeAction(sourceImage, targetImage,
            0, sourceImage.getHeight(), targetWidth, targetHeight));

    ImageIO.write(targetImage, "png", new File(targetImagePath));

    System.out.println("圖像調整大小成功!");
}

借助ForkJoinPool的幫助,您現在能夠更高效地調整圖像的大小,具有更好的可伸縮性,并最大程度地利用資源。

5. CompletableFuture

通過CompletableFuture,您可以完全發揮Future的功能,并擁有許多額外的特性。其中最突出的功能是它能夠鏈式地連接異步操作,使您能夠構建復雜的異步管道。

public static void main(String[] args) {
    CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
        System.out.println(Thread.currentThread().getName());
        return "Hyuni Kim";
    }).thenApply((data) -> {
        System.out.println(Thread.currentThread().getName());
        return "我的名字是" + data;
    }).thenAccept((data) -> {
        System.out.println(Thread.currentThread().getName());
        System.out.println("結果:" + data);
    });

    future.join();
}

上述代碼展示了CompletableFuture的一個關鍵方面:鏈式操作。通過CompletableFuture.supplyAsync(),首先創建并運行一個返回字符串結果的CompletableFuture。thenApply()接受前一個任務的結果,并執行其他操作,本例中是添加一個字符串。最后,thenAccept()打印生成的數據。結果如下所示:

ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-1
Result: My name is Hyuni Kim

有3個任務沒有在主線程中運行,這表明它們與主邏輯并行運行。當您有具有結果并需要鏈接的任務時,CompletableFuture將是一個很好的選擇。

6. 總結

多線程是一種強大的工具,可以幫助開發人員優化性能、提升用戶體驗、增強并發處理能力,并充分利用計算機的資源。

責任編輯:趙寧寧 來源: Java學研大本營
相關推薦

2024-07-12 11:54:38

2025-04-14 08:10:00

負載均衡代碼java

2015-09-10 09:30:54

Java多線程同步

2023-07-06 17:00:44

服務器

2022-03-14 18:37:38

IT效率首席信息官IT領導者

2025-06-23 00:00:05

2010-01-19 17:20:39

交換機能源效率

2016-11-01 11:11:54

數據中心大數據

2020-06-23 09:52:31

運營效率首席信息官IT預算

2022-03-13 23:44:49

Windows 10Windows 11Windows

2024-05-23 13:54:40

2019-09-20 08:00:00

開發技能Web開發 人工智能

2024-04-24 10:47:20

物聯網智能建筑

2024-06-27 08:23:13

2021-11-28 21:26:09

驅動程序電腦Windows 10

2010-03-15 19:47:30

Java多線程程序

2022-06-12 20:53:09

TS typeofJavaScript

2022-01-07 18:53:51

元素服務端數據

2021-12-16 15:40:35

編程語言微軟語言

2021-12-30 10:36:12

編程語言RubyFlahs
點贊
收藏

51CTO技術棧公眾號

亚洲欧美视频二区| 91黑丝高跟在线| www.99在线| 三级久久三级久久| 欧美国产日韩xxxxx| 午夜不卡视频| 国产精品婷婷午夜在线观看| 亚洲毛片aa| 久久电影院7| 久久久久久久久亚洲| 高h视频在线播放| 色婷婷久久久久swag精品| 可以免费观看av毛片| 另类欧美日韩国产在线| 国产高清在线一区二区| 久久91在线| 乱亲女秽乱长久久久| 这里有精品可以观看| 欧美精品少妇一区二区三区| 羞羞视频网站在线免费观看| 久久综合久久鬼色| 国产小视频免费| 麻豆精品一区二区三区| 精选一区二区三区四区五区| 国产精品久久观看| 国产精品久久久久久久久久ktv| 伊人精品久久| 久久精品电影网站| 欧美xxxx做受欧美护士| 欧美成人免费网站| 国产三区视频在线观看| 欧美午夜精品久久久久久孕妇| 男人天堂2020| 亚洲午夜久久久久久久久久久| 97操碰视频| 中文字幕日本乱码精品影院| 精品久久久久久久免费人妻| 国产麻豆成人精品| 成年女人18级毛片毛片免费| 狠狠色丁香婷婷综合| 粉嫩av一区二区三区天美传媒 | 美女毛片一区二区三区四区| 久久精品91久久久久久再现| 91p九色成人| 亚洲人成网站免费播放| 在线看的毛片| 色偷偷偷综合中文字幕;dd| 成人午夜亚洲| 久久久久久久久久久久av| av动漫精品一区二区| 午夜精品免费视频| 欧洲杯半决赛直播| 97人摸人人澡人人人超一碰| 欧美日本中文| 日韩av电影在线观看| 国产一区二区三区在线观看精品| 91精品国产毛片武则天| 久久久国产一区二区三区四区小说| 成年人免费在线播放| 亚洲欧洲日韩一区二区三区| 欧美著名女优| 欧美精品一卡二卡| 中文不卡1区2区3区| 欧美成人sm免费视频| 欧美三级美国一级| 国内精品视频在线播放| 国产一区二区不卡老阿姨| 欧美成人xxxxx| 一区二区久久久| av在线二区| 日韩精品中文字幕在线| av一级久久| 欧美一级大片在线观看| 中文字幕午夜精品一区二区三区| 日本成人三级| 不卡的av电影| 在线国产一级| 亚洲成人av在线播放| 丁香婷婷久久| 国产精品网站大全| 日韩va欧美va亚洲va久久| 免费在线观看亚洲视频| 亚洲一区二区在线视频| aaa大片在线观看| 欧美富婆性猛交| 午夜久久久久| 日本中文字幕网址| 偷窥国产亚洲免费视频| 黄色激情在线播放| 日韩免费观看在线观看| 日韩精品乱码av一区二区| 在线免费观看视频黄| 欧美剧情片在线观看| 欧美一区在线观看视频| 超碰97在线播放| 97se亚洲国产综合自在线 | www.欧美三级电影.com| 99精品美女| 日韩精品在线视频免费观看| 亚洲私人影院在线观看| 污视频网站在线免费| 5566成人精品视频免费| 日韩激情中文字幕| 天堂色在线视频| 亚洲国产高清福利视频| 亚洲肉体裸体xxxx137| 亚洲午夜精品一区二区三区| 亚洲精品视频免费看| 国产精品xx| 成人欧美一区二区| 亚洲欧洲av在线| 国产亚洲一区二区手机在线观看| 亚洲最大福利视频网| 国产香蕉久久精品综合网| 男女在线观看视频| 国产精品一区二区久久精品 | 久色婷婷小香蕉久久| 一级视频在线观看视频在线啦啦 | 久久99国产乱子伦精品免费| 蜜桃tv在线播放| 草民午夜欧美限制a级福利片| 国产亚洲精品自拍| 亚洲热app| 91成品人片a无限观看| 顶级嫩模精品视频在线看| 日本高清中文字幕在线| 欧美在线xxx| 国产亚洲成年网址在线观看| 久久电影tv| 日本精品一区二区三区不卡无字幕| 亚洲综合av网| 女同久久另类99精品国产| 搞av.com| 亚洲图片欧美午夜| 久久99久久99| 美女精品视频| 你懂的视频在线一区二区| 色综合一区二区三区| 日韩理论电影院| 国产一级粉嫩xxxx| 97精品视频在线播放| 久久精品人人做人人综合| 91精品国产66| 日韩精品一区二区免费| 亚洲精品在线三区| 久久夜色精品| dy888亚洲精品一区二区三区| 国产成人精品日本亚洲11| 欧美视频在线观看免费网址| av亚洲在线观看| 人人超碰在线| 成人欧美在线观看| 日韩欧美国产黄色| 婷婷综合五月| 四虎影视精品成人| 91视频免费进入| 色菇凉天天综合网| 黑人一区二区三区四区五区| 国产区在线视频| 国产一区免费在线观看| 91麻豆精品国产91| 久久99精品国产.久久久久久 | 免费成人在线电影| 最新精品视频| 亚洲欧美综合另类中字| 国产福利一区在线| 亚洲伊人精品酒店| 亚洲少妇第一页| 欧美在线观看日本一区| 亚洲一区二区美女| 国产综合自拍| 精品一性一色一乱农村| 一级黄色片播放| 精品自在线视频| 亚洲精品高清在线观看| 综合天天久久| 国产精品一品| 18禁男女爽爽爽午夜网站免费| 欧美激情精品在线| 午夜a成v人精品| 视频一区二区三区在线| 日产精品一区| 国产igao激情在线入口| 97视频中文字幕| 亚洲国产精品久久久久久| 国产高清久久久| 丁香5月婷婷久久| 手机福利在线| 亚洲欧美日产图| 欧美精品一区三区| 一区二区三区在线视频观看| 欧美91精品| 欧洲亚洲两性| 妞干网2018| 欧洲精品一区色| 欧美日韩成人黄色| 欧洲一区二区三区在线| 国产成人精品免费| 国产一区99| 蜜桃av在线播放|