自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你真的了解ForkJoinPool嗎?這些技巧讓你的代碼性能提升十倍!

開發(fā) 前端
ForkJoinPool是Java 7中新增的一種線程池實現(xiàn),它主要用于執(zhí)行大量的計算密集型任務。ForkJoinPool采用“工作竊取”算法,即當某個線程的任務執(zhí)行完畢后,會從其他線程的任務隊列中竊取任務執(zhí)行,從而實現(xiàn)負載均衡。

1、線程池簡介

線程池是一種常見的多線程編程方式,它可以有效地管理線程的創(chuàng)建、銷毀和復用,從而提高程序的性能和穩(wěn)定性。Java中提供了多種線程池實現(xiàn),包括ForkJoinPool、Executors、CompletionService等。

2、ForkJoinPool

ForkJoinPool是Java 7中新增的一種線程池實現(xiàn),它主要用于執(zhí)行大量的計算密集型任務。ForkJoinPool采用“工作竊取”算法,即當某個線程的任務執(zhí)行完畢后,會從其他線程的任務隊列中竊取任務執(zhí)行,從而實現(xiàn)負載均衡。

以下是一個使用ForkJoinPool的示例代碼:

import java.util.concurrent.*;

public class ForkJoinPoolExample {
    public static void main(String[] args) {
        int n = 1000000;
        int[] array = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = i;
        }

        ForkJoinPool pool = new ForkJoinPool();
        int sum = pool.invoke(new SumTask(array, 0, n));
        System.out.println("Sum: " + sum);
    }
}

class SumTask extends RecursiveTask<Integer> {
    private int[] array;
    private int start;
    private int end;

    public SumTask(int[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if (end - start <= 1000) {
            int sum = 0;
            for (int i = start; i < end; i++) {
                sum += array[i];
            }
            return sum;
        } else {
            int mid = (start + end) / 2;
            SumTask left = new SumTask(array, start, mid);
            SumTask right = new SumTask(array, mid, end);
            left.fork();
            right.fork();
            return left.join() + right.join();
        }
    }
}

以上代碼創(chuàng)建了一個ForkJoinPool,用于計算一個長度為1000000的數(shù)組的元素之和。其中,SumTask是一個繼承自RecursiveTask的任務類,用于將數(shù)組分成若干個子任務進行計算。當子任務的數(shù)量小于等于1000時,直接計算子任務的結果;否則,將子任務分成兩個部分,分別交給左右兩個子任務進行計算,最后將兩個子任務的結果相加。

3、Executors

Executors是Java中提供的一個線程池工具類,它可以方便地創(chuàng)建各種類型的線程池。Executors提供了多個靜態(tài)方法,用于創(chuàng)建不同類型的線程池,例如newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor等。

(1)newFixedThreadPool

newFixedThreadPool是一個固定大小的線程池,它會一直保持固定數(shù)量的線程,如果有新的任務提交,但線程池中的線程都在忙碌,那么新的任務就會進入等待隊列中等待執(zhí)行。

以下是一個使用newFixedThreadPool創(chuàng)建線程池的示例代碼:

import java.util.concurrent.*;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 20; i++) {
            Runnable task = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Task executed by " + Thread.currentThread().getName());
                }
            };
            executor.execute(task);
        }
        executor.shutdown();
    }
}

以上代碼創(chuàng)建了一個固定大小為5的線程池,提交了20個任務,并關閉了線程池。每個任務的執(zhí)行會輸出執(zhí)行線程的名稱。

(2)newCachedThreadPool

newCachedThreadPool是一個可緩存的線程池,它會根據(jù)需要創(chuàng)建新的線程,如果有線程空閑時間超過60秒,就會被回收。如果有新的任務提交,但線程池中的線程都在忙碌,那么就會創(chuàng)建新的線程來處理任務。

以下是一個使用newCachedThreadPool創(chuàng)建線程池的示例代碼:

import java.util.concurrent.*;

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();
        for (int i = 0; i < 20; i++) {
            Runnable task = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Task executed by " + Thread.currentThread().getName());
                }
            };
            executor.execute(task);
        }
        executor.shutdown();
    }
}

以上代碼創(chuàng)建了一個可緩存的線程池,提交了20個任務,并關閉了線程池。每個任務的執(zhí)行會輸出執(zhí)行線程的名稱。

(3)newSingleThreadExecutor

newSingleThreadExecutor是一個單線程的線程池,它會保證所有任務按照順序執(zhí)行,即每個任務都會在前一個任務執(zhí)行完畢后才會執(zhí)行。

以下是一個使用newSingleThreadExecutor創(chuàng)建線程池的示例代碼:

import java.util.concurrent.*;

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 20; i++) {
            Runnable task = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Task executed by " + Thread.currentThread().getName());
                }
            };
            executor.execute(task);
        }
        executor.shutdown();
    }
}

以上代碼創(chuàng)建了一個單線程的線程池,提交了20個任務,并關閉了線程池。每個任務的執(zhí)行會輸出執(zhí)行線程的名稱。

4、CompletionService

CompletionService是Java中提供的一個用于異步執(zhí)行任務的工具類,它可以方便地獲取已完成的任務的結果。CompletionService內部維護了一個阻塞隊列,用于存儲已完成的任務的結果。

以下是一個使用CompletionService的示例代碼:

import java.util.concurrent.*;

public class CompletionServiceExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        CompletionService<Integer> completionService = new ExecutorCompletionService<>(executor);
        for (int i = 0; i < 10; i++) {
            final int index = i;
            Callable<Integer> task = new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    Thread.sleep((long) (Math.random() * 1000));
                    return index;
                }
            };
            completionService.submit(task);
        }
        for (int i = 0; i < 10; i++) {
            Future<Integer> future = completionService.take();
            System.out.println("Result: " + future.get());
        }
        executor.shutdown();
    }
}

以上代碼創(chuàng)建了一個固定大小為5的線程池,提交了10個任務,并使用CompletionService獲取已完成的任務的結果。每個任務會隨機休眠一段時間,然后返回任務的編號。在主線程中,使用completionService.take()方法獲取已完成的任務的結果,并輸出任務的編號。

5、Callable和Future

Callable是Java中提供的一個接口,它類似于Runnable接口,但是可以返回執(zhí)行結果。Future是Java中提供的一個接口,它可以用于獲取異步執(zhí)行任務的結果。

以下是一個使用Callable和Future的示例代碼:

import java.util.concurrent.*;

public class CallableAndFutureExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Callable<Integer> task = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(1000);
                return 1 + 2;
            }
        };
        Future<Integer> future = executor.submit(task);
        System.out.println("Result: " + future.get());
        executor.shutdown();
    }
}

以上代碼創(chuàng)建了一個單線程的線程池,提交了一個任務,并使用Future獲取任務的執(zhí)行結果。任務會休眠1秒鐘,然后返回1+2的結果。在主線程中,使用future.get()方法獲取任務的執(zhí)行結果,并輸出結果。

6、Runnable和Thread

Runnable是Java中提供的一個接口,它表示一個可以被線程執(zhí)行的任務。Thread是Java中提供的一個類,它表示一個線程。

以下是一個使用Runnable和Thread的示例代碼:

public class RunnableAndThreadExample {
    public static void main(String[] args) throws InterruptedException {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed by " + Thread.currentThread().getName());
            }
        };
        Thread thread = new Thread(task);
        thread.start();
        thread.join();
    }
}

以上代碼創(chuàng)建了一個任務,并使用Thread將任務提交到一個新的線程中執(zhí)行。在主線程中,使用thread.join()方法等待新線程執(zhí)行完畢。每個任務的執(zhí)行會輸出執(zhí)行線程的名稱。

7、總結

本文介紹了Java中常見的線程池實現(xiàn),包括ForkJoinPool、Executors、CompletionService、Callable、Future、Runnable等知識點的詳細講解和完整可運行的代碼示例。線程池是Java中常見的多線程編程方式,它可以有效地管理線程的創(chuàng)建、銷毀和復用,從而提高程序的性能和穩(wěn)定性。在實際開發(fā)中,需要根據(jù)具體的需求選擇合適的線程池實現(xiàn)。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-07-26 07:41:53

Python線程狀態(tài)

2022-10-27 07:09:34

DjangoAPIRedis

2024-06-27 11:22:34

2017-09-26 14:56:57

MongoDBLBS服務性能

2020-07-21 15:40:55

NginxJava服務器

2021-03-18 07:52:42

代碼性能技巧開發(fā)

2023-09-07 11:29:36

API開發(fā)

2025-03-03 13:12:33

C#代碼Python

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2014-04-17 16:42:03

DevOps

2020-07-08 17:06:00

Python開發(fā)工具

2023-02-06 07:17:22

2024-12-06 06:20:00

代碼枚舉

2014-03-26 10:00:06

RailsRails性能

2025-01-03 08:09:15

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2019-09-16 08:40:42

2020-02-27 10:49:26

HTTPS網(wǎng)絡協(xié)議TCP

2014-11-28 10:31:07

Hybrid APP
點贊
收藏

51CTO技術棧公眾號