前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程池(1)——线程池的使用

线程池(1)——线程池的使用

作者头像
黑洞代码
发布2021-01-14 15:11:47
2.8K0
发布2021-01-14 15:11:47
举报

概述


1.ThreadPoolExecutor

2.ForkJoinPool

3.ThreadPoolExecutor VS ForkJoinPool

第1节 ThreadPoolExecutor


ThreadPoolExecutor执行无返回值的任务。

代码语言:javascript
复制
public class ThreadTest {

    public static void main(String[] args) {
        /* 核心线程池的大小 */
        int corePoolSize = 2;
        /* 核心线程池的最大线程数 */
        int maxPoolSize = 4;
        /* 线程最大空闲时间 */
        long keepAliveTime = 10;
        /* 时间单位 */
        TimeUnit unit = TimeUnit.SECONDS;
        /* 阻塞队列 容量为2 */
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);
        /* 线程创建工厂 */
        ThreadFactory threadFactory = new NameTreadFactory();
        /* 线程池拒绝策略 */
        RejectedExecutionHandler handler = new MyIgnorePolicy();
        ThreadPoolExecutor executor = null;
        try {
            /* 推荐的创建线程池的方式 */
            /* 不推荐使用现成的API创建线程池 */
            executor = new ThreadPoolExecutor(corePoolSize,
                    maxPoolSize, keepAliveTime, unit,
                    workQueue, threadFactory, handler);
            /* 预启动所有核心线程  提升效率 */
            executor.prestartAllCoreThreads();
            /* 任务数量 */
            int count = 10;
            for (int i = 1; i <= count; i++) {
                RunnableTask task = new RunnableTask(String.valueOf(i));
                executor.submit(task);
            }
        } finally {
            assert executor != null;
            executor.shutdown();
        }

    }

    /**
     * 线程工厂
     */
    static class NameTreadFactory implements ThreadFactory {
        /* 线程id */
        private final AtomicInteger threadId = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable runnable) {
            Thread t = new Thread(runnable, "线程-" + threadId.getAndIncrement());
            System.out.println(t.getName() + " 已经被创建");
            return t;
        }
    }

    /**
     * 线程池拒绝策略
     */
    public static class MyIgnorePolicy implements RejectedExecutionHandler {

        @Override
        public void rejectedExecution(Runnable runnable, ThreadPoolExecutor e) {
            doLog(runnable, e);
        }

        private void doLog(Runnable runnable, ThreadPoolExecutor e) {
            // 可做日志记录等
            System.err.println(runnable.toString() + " rejected");
        }
    }

    /**
     * 线程
     */
    static class RunnableTask implements Runnable {
        private String name;

        public RunnableTask(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                System.out.println(this.toString() + " is running!");
                //让任务执行慢点
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        public String toString() {
            return "RunnableTask [name=" + name + "]";
        }
    }

}

执行结果如下。

代码语言:javascript
复制
线程-1 已经被创建
线程-2 已经被创建
线程-3 已经被创建
RunnableTask [name=1] is running!
RunnableTask [name=2] is running!
线程-4 已经被创建
RunnableTask [name=3] is running!
java.util.concurrent.FutureTask@1f32e575 rejected
java.util.concurrent.FutureTask@279f2327 rejected
java.util.concurrent.FutureTask@2ff4acd0 rejected
java.util.concurrent.FutureTask@54bedef2 rejected
RunnableTask [name=6] is running!
RunnableTask [name=4] is running!
RunnableTask [name=5] is running!

ThreadPoolExecutor执行有返回值的任务。

代码语言:javascript
复制
public class CallableTest {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = null;
        int count = 10;
        try {
            // !!! 不推荐使用Executors的静态方法创建线程池 !!!
            executor = Executors.newCachedThreadPool();
            CompletionService<String> completionService = new ExecutorCompletionService<>(executor);
            for (int i = 0; i < count; i++) {
                FactorialCalculator factorialCalculator = new FactorialCalculator(i);
                completionService.submit(factorialCalculator);
            }

            for (int i = 0; i < count; i++) {
                Future<String> result = completionService.take();
                System.out.print(result.get());
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
        } finally {
            assert executor != null;
            executor.shutdown();
        }
    }
}

public class FactorialCalculator implements Callable<String> {

    private Integer number;

    public FactorialCalculator(Integer number) {
        this.number = number;
    }

    @Override
    public String call() throws Exception {
        int result = 1;

        if (number == 0 || number == 1) {
            result = 1;
        } else {
            for (int i = 2; i <= number; i++) {
                result *= i;
                TimeUnit.MICROSECONDS.sleep(200);
            }
        }
        return String.format("%s输出%d的阶乘为:%d\n",
                Thread.currentThread().getName(), number, result);
    }
}

执行结果如下。

代码语言:javascript
复制
pool-1-thread-3输出2的阶乘为:2
pool-1-thread-6输出5的阶乘为:120
pool-1-thread-5输出4的阶乘为:24
pool-1-thread-4输出3的阶乘为:6
pool-1-thread-9输出8的阶乘为:40320
pool-1-thread-7输出6的阶乘为:720
pool-1-thread-1输出0的阶乘为:1
pool-1-thread-8输出7的阶乘为:5040
pool-1-thread-2输出1的阶乘为:1
pool-1-thread-10输出9的阶乘为:362880

第2节 ForkJoinPool


ForkJoin线程池处理无返回值任务。

代码语言:javascript
复制
public class ForkJoinPoolAction {

    public static final Set<Integer> RESULT_SET = new CopyOnWriteArraySet<>();

    public static void main(String[] args) throws Exception {
        // 验证CopyOnWriteArraySet功能 —— 去重
//        validateSet(RESULT_SET);
        // 验证FolkJoinPool功能
        validateFolkJoin();
    }

    /**
     * 验证FolkJoinPool功能
     *
     * @throws InterruptedException 中断异常
     */
    private static void validateFolkJoin() throws InterruptedException {
        // 需求:简单打印1-3000的数字
        // 程序将一个大任务拆分成多个小任务
        // 并将任务交给ForkJoinPool来执行
        PrintTask task = new PrintTask(0, 3000);
        //创建线程池
        ForkJoinPool pool = new ForkJoinPool();
        //将task提交至线程池
        pool.submit(task);
        //线程阻塞,等待所有任务完成
        pool.awaitTermination(2, TimeUnit.SECONDS);

        System.out.printf("RESULT_SET的大小=%s", RESULT_SET.size());
        pool.shutdown();
    }

    /**
     * 验证CopyOnWriteArraySet功能 —— 去重
     *
     * @param resultSet 结果集
     */
    private static void validateSet(Set<Integer> resultSet) {
        resultSet.add(1);
        resultSet.add(1);
        System.out.printf("resultSet大小=%s", resultSet.size());
    }
}

public class PrintTask extends RecursiveAction {
    /**
     * 最多只能打印50个数
     */
    private static final int THRESHOLD = 50;
    private int start;
    private int end;

    @Override
    protected void compute() {
        if (end - start < THRESHOLD) {
            for (int i = start; i < end; i++) {
                ForkJoinPoolAction.RESULT_SET.add(i);
                System.out.println(Thread.currentThread().getName() 
                        + "的i值\t" + i);
            }
        } else {
            //递归切分
            int mid = (start + end) / 2;
            PrintTask leftTask = new PrintTask(start, mid);
            PrintTask rightTask = new PrintTask(mid, end);
            //并行执行两个任务
            leftTask.fork();
            rightTask.fork();
        }
    }

    public PrintTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

}

执行结果如下。

代码语言:javascript
复制
ForkJoinPool-1-worker-4的i值  703
ForkJoinPool-1-worker-4的i值  704
ForkJoinPool-1-worker-5的i值  1640
ForkJoinPool-1-worker-5的i值  1641
ForkJoinPool-1-worker-1的i值  328
ForkJoinPool-1-worker-1的i值  329
ForkJoinPool-1-worker-1的i值  330
ForkJoinPool-1-worker-0的i值  515
ForkJoinPool-1-worker-0的i值  516
ForkJoinPool-1-worker-0的i值  517
ForkJoinPool-1-worker-3的i值  2203
ForkJoinPool-1-worker-3的i值  2204
ForkJoinPool-1-worker-7的i值  2953
ForkJoinPool-1-worker-7的i值  2954
ForkJoinPool-1-worker-7的i值  2955
ForkJoinPool-1-worker-7的i值  2956
ForkJoinPool-1-worker-7的i值  2957
ForkJoinPool-1-worker-7的i值  2958
ForkJoinPool-1-worker-7的i值  2959
ForkJoinPool-1-worker-7的i值  2960
ForkJoinPool-1-worker-7的i值  2961
ForkJoinPool-1-worker-7的i值  2962
ForkJoinPool-1-worker-7的i值  2963
ForkJoinPool-1-worker-7的i值  2964
ForkJoinPool-1-worker-7的i值  2965
ForkJoinPool-1-worker-7的i值  2966
ForkJoinPool-1-worker-3的i值  2205
ForkJoinPool-1-worker-6的i值  1828
ForkJoinPool-1-worker-6的i值  1829
ForkJoinPool-1-worker-6的i值  1830
ForkJoinPool-1-worker-6的i值  1831
ForkJoinPool-1-worker-3的i值  2206
ForkJoinPool-1-worker-2的i值  1453
ForkJoinPool-1-worker-2的i值  1454
ForkJoinPool-1-worker-2的i值  1455
ForkJoinPool-1-worker-0的i值  518
ForkJoinPool-1-worker-6的i值  1832
ForkJoinPool-1-worker-6的i值  1833
ForkJoinPool-1-worker-6的i值  1834
ForkJoinPool-1-worker-6的i值  1835
ForkJoinPool-1-worker-1的i值  331
ForkJoinPool-1-worker-5的i值  1642
ForkJoinPool-1-worker-4的i值  705
ForkJoinPool-1-worker-4的i值  706
ForkJoinPool-1-worker-5的i值  1643
ForkJoinPool-1-worker-5的i值  1644
ForkJoinPool-1-worker-5的i值  1645
ForkJoinPool-1-worker-5的i值  1646
ForkJoinPool-1-worker-5的i值  1647
ForkJoinPool-1-worker-5的i值  1648
ForkJoinPool-1-worker-5的i值  1649
ForkJoinPool-1-worker-5的i值  1650
ForkJoinPool-1-worker-5的i值  1651
ForkJoinPool-1-worker-5的i值  1652
ForkJoinPool-1-worker-4的i值  707
ForkJoinPool-1-worker-1的i值  332
ForkJoinPool-1-worker-6的i值  1836
ForkJoinPool-1-worker-6的i值  1837
ForkJoinPool-1-worker-0的i值  519
ForkJoinPool-1-worker-0的i值  520
ForkJoinPool-1-worker-0的i值  521
ForkJoinPool-1-worker-0的i值  522
ForkJoinPool-1-worker-0的i值  523
ForkJoinPool-1-worker-2的i值  1456
ForkJoinPool-1-worker-2的i值  1457
ForkJoinPool-1-worker-2的i值  1458
ForkJoinPool-1-worker-2的i值  1459
ForkJoinPool-1-worker-2的i值  1460
ForkJoinPool-1-worker-2的i值  1461
ForkJoinPool-1-worker-3的i值  2207
ForkJoinPool-1-worker-3的i值  2208
ForkJoinPool-1-worker-7的i值  2967
ForkJoinPool-1-worker-3的i值  2209
ForkJoinPool-1-worker-2的i值  1462
ForkJoinPool-1-worker-0的i值  524
ForkJoinPool-1-worker-6的i值  1838
ForkJoinPool-1-worker-1的i值  333
ForkJoinPool-1-worker-4的i值  708
ForkJoinPool-1-worker-5的i值  1653
ForkJoinPool-1-worker-4的i值  709
ForkJoinPool-1-worker-1的i值  334
ForkJoinPool-1-worker-6的i值  1839
ForkJoinPool-1-worker-0的i值  525
ForkJoinPool-1-worker-2的i值  1463
ForkJoinPool-1-worker-2的i值  1464
ForkJoinPool-1-worker-2的i值  1465
ForkJoinPool-1-worker-2的i值  1466
ForkJoinPool-1-worker-2的i值  1467
ForkJoinPool-1-worker-2的i值  1468
ForkJoinPool-1-worker-2的i值  1469
ForkJoinPool-1-worker-2的i值  1470
ForkJoinPool-1-worker-2的i值  1471
ForkJoinPool-1-worker-2的i值  1472
ForkJoinPool-1-worker-2的i值  1473
ForkJoinPool-1-worker-2的i值  1474
ForkJoinPool-1-worker-2的i值  1475
ForkJoinPool-1-worker-2的i值  1476
ForkJoinPool-1-worker-2的i值  1477
ForkJoinPool-1-worker-2的i值  1478
ForkJoinPool-1-worker-3的i值  2210
ForkJoinPool-1-worker-7的i值  2968
ForkJoinPool-1-worker-3的i值  2211
ForkJoinPool-1-worker-2的i值  1479
ForkJoinPool-1-worker-0的i值  526
ForkJoinPool-1-worker-6的i值  1840
ForkJoinPool-1-worker-1的i值  335
ForkJoinPool-1-worker-1的i值  336
ForkJoinPool-1-worker-1的i值  337
ForkJoinPool-1-worker-1的i值  338
ForkJoinPool-1-worker-1的i值  339
ForkJoinPool-1-worker-1的i值  340
ForkJoinPool-1-worker-1的i值  341
ForkJoinPool-1-worker-1的i值  342
ForkJoinPool-1-worker-1的i值  343
ForkJoinPool-1-worker-1的i值  344
ForkJoinPool-1-worker-1的i值  345
ForkJoinPool-1-worker-1的i值  346
ForkJoinPool-1-worker-1的i值  347
ForkJoinPool-1-worker-4的i值  710
ForkJoinPool-1-worker-5的i值  1654
ForkJoinPool-1-worker-5的i值  1655
ForkJoinPool-1-worker-5的i值  1656
ForkJoinPool-1-worker-5的i值  1657
ForkJoinPool-1-worker-5的i值  1658
ForkJoinPool-1-worker-4的i值  711
ForkJoinPool-1-worker-1的i值  348
ForkJoinPool-1-worker-6的i值  1841
ForkJoinPool-1-worker-0的i值  527
ForkJoinPool-1-worker-2的i值  1480
ForkJoinPool-1-worker-3的i值  2212
ForkJoinPool-1-worker-7的i值  2969
ForkJoinPool-1-worker-3的i值  2213
ForkJoinPool-1-worker-2的i值  1481
ForkJoinPool-1-worker-0的i值  528
ForkJoinPool-1-worker-6的i值  1842
ForkJoinPool-1-worker-1的i值  349
ForkJoinPool-1-worker-4的i值  712
ForkJoinPool-1-worker-5的i值  1659
ForkJoinPool-1-worker-4的i值  713
ForkJoinPool-1-worker-1的i值  350
ForkJoinPool-1-worker-6的i值  1843
ForkJoinPool-1-worker-0的i值  529
ForkJoinPool-1-worker-2的i值  1482
ForkJoinPool-1-worker-3的i值  2214
ForkJoinPool-1-worker-7的i值  2970
ForkJoinPool-1-worker-3的i值  2215
ForkJoinPool-1-worker-2的i值  1483
ForkJoinPool-1-worker-0的i值  530
ForkJoinPool-1-worker-6的i值  1844
ForkJoinPool-1-worker-1的i值  351
ForkJoinPool-1-worker-4的i值  714
ForkJoinPool-1-worker-5的i值  1660
ForkJoinPool-1-worker-4的i值  715
ForkJoinPool-1-worker-1的i值  352
ForkJoinPool-1-worker-6的i值  1845
ForkJoinPool-1-worker-0的i值  531
ForkJoinPool-1-worker-2的i值  1484
ForkJoinPool-1-worker-3的i值  2216
ForkJoinPool-1-worker-7的i值  2971
ForkJoinPool-1-worker-3的i值  2217
ForkJoinPool-1-worker-2的i值  1485
ForkJoinPool-1-worker-0的i值  532
ForkJoinPool-1-worker-6的i值  1846
ForkJoinPool-1-worker-1的i值  353
ForkJoinPool-1-worker-4的i值  716
ForkJoinPool-1-worker-5的i值  1661
ForkJoinPool-1-worker-4的i值  717
ForkJoinPool-1-worker-1的i值  354
ForkJoinPool-1-worker-6的i值  1847
ForkJoinPool-1-worker-0的i值  533
ForkJoinPool-1-worker-2的i值  1486
ForkJoinPool-1-worker-3的i值  2218
ForkJoinPool-1-worker-7的i值  2972
ForkJoinPool-1-worker-3的i值  2219
ForkJoinPool-1-worker-2的i值  1487
ForkJoinPool-1-worker-3的i值  2220
ForkJoinPool-1-worker-0的i值  534
ForkJoinPool-1-worker-6的i值  1848
ForkJoinPool-1-worker-0的i值  535
ForkJoinPool-1-worker-1的i值  355
ForkJoinPool-1-worker-0的i值  536
ForkJoinPool-1-worker-4的i值  718
ForkJoinPool-1-worker-5的i值  1662
ForkJoinPool-1-worker-4的i值  719
ForkJoinPool-1-worker-0的i值  537
ForkJoinPool-1-worker-1的i值  356
ForkJoinPool-1-worker-0的i值  538
ForkJoinPool-1-worker-6的i值  1849
ForkJoinPool-1-worker-3的i值  2221
ForkJoinPool-1-worker-2的i值  1488
ForkJoinPool-1-worker-7的i值  2973
ForkJoinPool-1-worker-2的i值  1489
ForkJoinPool-1-worker-7的i值  2974
ForkJoinPool-1-worker-2的i值  1490
ForkJoinPool-1-worker-3的i值  2222
ForkJoinPool-1-worker-6的i值  1850
ForkJoinPool-1-worker-3的i值  2223
ForkJoinPool-1-worker-0的i值  539
ForkJoinPool-1-worker-3的i值  2224
ForkJoinPool-1-worker-1的i值  357
ForkJoinPool-1-worker-3的i值  2225
ForkJoinPool-1-worker-1的i值  358
ForkJoinPool-1-worker-4的i值  720
ForkJoinPool-1-worker-5的i值  1663
ForkJoinPool-1-worker-4的i值  721
ForkJoinPool-1-worker-5的i值  1664
ForkJoinPool-1-worker-1的i值  359
ForkJoinPool-1-worker-3的i值  2226
ForkJoinPool-1-worker-0的i值  540
ForkJoinPool-1-worker-6的i值  1851
ForkJoinPool-1-worker-2的i值  1491
ForkJoinPool-1-worker-7的i值  2975
ForkJoinPool-1-worker-2的i值  1492
ForkJoinPool-1-worker-6的i值  1852
ForkJoinPool-1-worker-0的i值  541
ForkJoinPool-1-worker-3的i值  2227
ForkJoinPool-1-worker-1的i值  360
ForkJoinPool-1-worker-5的i值  1665
ForkJoinPool-1-worker-4的i值  722
ForkJoinPool-1-worker-5的i值  1666
ForkJoinPool-1-worker-1的i值  361
ForkJoinPool-1-worker-3的i值  2228
ForkJoinPool-1-worker-0的i值  542
ForkJoinPool-1-worker-6的i值  1853
ForkJoinPool-1-worker-2的i值  1493
ForkJoinPool-1-worker-7的i值  2976
ForkJoinPool-1-worker-2的i值  1494
ForkJoinPool-1-worker-6的i值  1854
ForkJoinPool-1-worker-0的i值  543
ForkJoinPool-1-worker-3的i值  2229
ForkJoinPool-1-worker-1的i值  362
ForkJoinPool-1-worker-5的i值  1667
ForkJoinPool-1-worker-4的i值  723
ForkJoinPool-1-worker-5的i值  1668
ForkJoinPool-1-worker-1的i值  363
ForkJoinPool-1-worker-3的i值  2230
ForkJoinPool-1-worker-0的i值  544
ForkJoinPool-1-worker-6的i值  1855
ForkJoinPool-1-worker-2的i值  1495
ForkJoinPool-1-worker-7的i值  2977
ForkJoinPool-1-worker-2的i值  1496
ForkJoinPool-1-worker-6的i值  1856
ForkJoinPool-1-worker-0的i值  545
ForkJoinPool-1-worker-3的i值  2231
ForkJoinPool-1-worker-1的i值  364
ForkJoinPool-1-worker-3的i值  2232
ForkJoinPool-1-worker-1的i值  365
ForkJoinPool-1-worker-5的i值  1669
ForkJoinPool-1-worker-4的i值  724
ForkJoinPool-1-worker-5的i值  1670
ForkJoinPool-1-worker-1的i值  366
ForkJoinPool-1-worker-3的i值  2233
ForkJoinPool-1-worker-0的i值  546
ForkJoinPool-1-worker-6的i值  1857
ForkJoinPool-1-worker-2的i值  1497
ForkJoinPool-1-worker-6的i值  1858
ForkJoinPool-1-worker-7的i值  2978
ForkJoinPool-1-worker-6的i值  1859
ForkJoinPool-1-worker-2的i值  1498
ForkJoinPool-1-worker-0的i值  547
ForkJoinPool-1-worker-3的i值  2234
ForkJoinPool-1-worker-1的i值  367
ForkJoinPool-1-worker-5的i值  1671
ForkJoinPool-1-worker-4的i值  725
ForkJoinPool-1-worker-5的i值  1672
ForkJoinPool-1-worker-1的i值  368
ForkJoinPool-1-worker-3的i值  2235
ForkJoinPool-1-worker-0的i值  548
ForkJoinPool-1-worker-2的i值  1499
ForkJoinPool-1-worker-6的i值  1860
ForkJoinPool-1-worker-7的i值  2979
ForkJoinPool-1-worker-6的i值  1861
ForkJoinPool-1-worker-2的i值  1406
ForkJoinPool-1-worker-0的i值  549
ForkJoinPool-1-worker-3的i值  2236
ForkJoinPool-1-worker-3的i值  2237
ForkJoinPool-1-worker-1的i值  369
ForkJoinPool-1-worker-5的i值  1673
ForkJoinPool-1-worker-4的i值  726
ForkJoinPool-1-worker-5的i值  1674
ForkJoinPool-1-worker-1的i值  370
ForkJoinPool-1-worker-3的i值  2238
ForkJoinPool-1-worker-0的i值  550
ForkJoinPool-1-worker-2的i值  1407
ForkJoinPool-1-worker-6的i值  1862
ForkJoinPool-1-worker-7的i值  2980
ForkJoinPool-1-worker-6的i值  1863
ForkJoinPool-1-worker-2的i值  1408
ForkJoinPool-1-worker-2的i值  1409
ForkJoinPool-1-worker-0的i值  551
ForkJoinPool-1-worker-3的i值  2239
ForkJoinPool-1-worker-1的i值  371
ForkJoinPool-1-worker-5的i值  1675
ForkJoinPool-1-worker-4的i值  727
ForkJoinPool-1-worker-5的i值  1676
ForkJoinPool-1-worker-1的i值  372
ForkJoinPool-1-worker-3的i值  2240
ForkJoinPool-1-worker-0的i值  552
ForkJoinPool-1-worker-2的i值  1410
ForkJoinPool-1-worker-6的i值  1864
ForkJoinPool-1-worker-7的i值  2981
ForkJoinPool-1-worker-6的i值  1865
ForkJoinPool-1-worker-2的i值  1411
ForkJoinPool-1-worker-0的i值  553
ForkJoinPool-1-worker-3的i值  2241
ForkJoinPool-1-worker-1的i值  373
ForkJoinPool-1-worker-5的i值  1677
ForkJoinPool-1-worker-4的i值  728
ForkJoinPool-1-worker-5的i值  1678
ForkJoinPool-1-worker-1的i值  374
ForkJoinPool-1-worker-3的i值  2242
ForkJoinPool-1-worker-0的i值  554
ForkJoinPool-1-worker-2的i值  1412
ForkJoinPool-1-worker-6的i值  1866
ForkJoinPool-1-worker-7的i值  2982
ForkJoinPool-1-worker-6的i值  1867
ForkJoinPool-1-worker-2的i值  1413
ForkJoinPool-1-worker-0的i值  555
ForkJoinPool-1-worker-3的i值  2243
ForkJoinPool-1-worker-1的i值  281
ForkJoinPool-1-worker-5的i值  1679
ForkJoinPool-1-worker-4的i值  729
ForkJoinPool-1-worker-5的i值  1680
ForkJoinPool-1-worker-1的i值  282
ForkJoinPool-1-worker-3的i值  2244
ForkJoinPool-1-worker-0的i值  556
ForkJoinPool-1-worker-2的i值  1414
ForkJoinPool-1-worker-6的i值  1868
ForkJoinPool-1-worker-7的i值  2983
ForkJoinPool-1-worker-6的i值  1869
ForkJoinPool-1-worker-2的i值  1415
ForkJoinPool-1-worker-0的i值  557
ForkJoinPool-1-worker-3的i值  2245
ForkJoinPool-1-worker-1的i值  283
ForkJoinPool-1-worker-5的i值  1681
ForkJoinPool-1-worker-4的i值  730
ForkJoinPool-1-worker-5的i值  1682
ForkJoinPool-1-worker-1的i值  284
ForkJoinPool-1-worker-3的i值  2246
ForkJoinPool-1-worker-0的i值  558
ForkJoinPool-1-worker-2的i值  1416
ForkJoinPool-1-worker-6的i值  1870
ForkJoinPool-1-worker-7的i值  2984
ForkJoinPool-1-worker-6的i值  1871
ForkJoinPool-1-worker-2的i值  1417
ForkJoinPool-1-worker-0的i值  559
ForkJoinPool-1-worker-3的i值  2247
ForkJoinPool-1-worker-1的i值  285
ForkJoinPool-1-worker-5的i值  1683
ForkJoinPool-1-worker-1的i值  286
ForkJoinPool-1-worker-4的i值  731
ForkJoinPool-1-worker-1的i值  287
ForkJoinPool-1-worker-5的i值  1684
ForkJoinPool-1-worker-3的i值  2248
ForkJoinPool-1-worker-0的i值  560
ForkJoinPool-1-worker-2的i值  1418
ForkJoinPool-1-worker-6的i值  1872
ForkJoinPool-1-worker-7的i值  2985
ForkJoinPool-1-worker-6的i值  1873
ForkJoinPool-1-worker-2的i值  1419
ForkJoinPool-1-worker-0的i值  561
ForkJoinPool-1-worker-3的i值  2249
ForkJoinPool-1-worker-5的i值  1685
ForkJoinPool-1-worker-1的i值  288
ForkJoinPool-1-worker-1的i值  289
ForkJoinPool-1-worker-1的i值  290
ForkJoinPool-1-worker-1的i值  291
ForkJoinPool-1-worker-1的i值  292
ForkJoinPool-1-worker-1的i值  293
ForkJoinPool-1-worker-1的i值  294
ForkJoinPool-1-worker-4的i值  732
ForkJoinPool-1-worker-4的i值  733
ForkJoinPool-1-worker-4的i值  734
ForkJoinPool-1-worker-4的i值  735
ForkJoinPool-1-worker-4的i值  736
ForkJoinPool-1-worker-1的i值  295
ForkJoinPool-1-worker-5的i值  1686
ForkJoinPool-1-worker-5的i值  1593
ForkJoinPool-1-worker-5的i值  1594
ForkJoinPool-1-worker-3的i值  2156
ForkJoinPool-1-worker-3的i值  2157
ForkJoinPool-1-worker-3的i值  2158
ForkJoinPool-1-worker-3的i值  2159
ForkJoinPool-1-worker-0的i值  468
ForkJoinPool-1-worker-0的i值  469
ForkJoinPool-1-worker-0的i值  470
ForkJoinPool-1-worker-2的i值  1420
ForkJoinPool-1-worker-6的i值  1874
ForkJoinPool-1-worker-7的i值  2986
ForkJoinPool-1-worker-6的i值  1781
ForkJoinPool-1-worker-2的i值  1421
ForkJoinPool-1-worker-0的i值  471
ForkJoinPool-1-worker-3的i值  2160
ForkJoinPool-1-worker-0的i值  472
ForkJoinPool-1-worker-0的i值  473
ForkJoinPool-1-worker-0的i值  474
ForkJoinPool-1-worker-0的i值  475
ForkJoinPool-1-worker-0的i值  476
ForkJoinPool-1-worker-0的i值  477
ForkJoinPool-1-worker-0的i值  478
ForkJoinPool-1-worker-0的i值  479
ForkJoinPool-1-worker-0的i值  480
ForkJoinPool-1-worker-0的i值  481
ForkJoinPool-1-worker-0的i值  482
ForkJoinPool-1-worker-0的i值  483
ForkJoinPool-1-worker-0的i值  484
ForkJoinPool-1-worker-0的i值  485
ForkJoinPool-1-worker-0的i值  486
ForkJoinPool-1-worker-0的i值  487
ForkJoinPool-1-worker-0的i值  488
ForkJoinPool-1-worker-0的i值  489
ForkJoinPool-1-worker-5的i值  1595
ForkJoinPool-1-worker-5的i值  1596
ForkJoinPool-1-worker-1的i值  296
ForkJoinPool-1-worker-4的i值  737
ForkJoinPool-1-worker-1的i值  297
ForkJoinPool-1-worker-5的i值  1597
ForkJoinPool-1-worker-1的i值  298
ForkJoinPool-1-worker-0的i值  490
ForkJoinPool-1-worker-3的i值  2161
ForkJoinPool-1-worker-2的i值  1422
ForkJoinPool-1-worker-6的i值  1782
ForkJoinPool-1-worker-2的i值  1423
ForkJoinPool-1-worker-6的i值  1783
ForkJoinPool-1-worker-2的i值  1424
ForkJoinPool-1-worker-7的i值  2987
ForkJoinPool-1-worker-2的i值  1425
ForkJoinPool-1-worker-7的i值  2988
ForkJoinPool-1-worker-2的i值  1426
ForkJoinPool-1-worker-6的i值  1784
ForkJoinPool-1-worker-3的i值  2162
ForkJoinPool-1-worker-0的i值  491
ForkJoinPool-1-worker-1的i值  299
ForkJoinPool-1-worker-5的i值  1598
ForkJoinPool-1-worker-4的i值  738
ForkJoinPool-1-worker-5的i值  1599
ForkJoinPool-1-worker-4的i值  739
ForkJoinPool-1-worker-5的i值  1600
ForkJoinPool-1-worker-1的i值  300
ForkJoinPool-1-worker-0的i值  492
ForkJoinPool-1-worker-3的i值  2163
ForkJoinPool-1-worker-6的i值  1785
ForkJoinPool-1-worker-2的i值  1427
ForkJoinPool-1-worker-7的i值  2989
ForkJoinPool-1-worker-2的i值  1428
ForkJoinPool-1-worker-7的i值  2990
ForkJoinPool-1-worker-2的i值  1429
ForkJoinPool-1-worker-6的i值  1786
ForkJoinPool-1-worker-3的i值  2164
ForkJoinPool-1-worker-6的i值  1787
ForkJoinPool-1-worker-0的i值  493
ForkJoinPool-1-worker-6的i值  1788
ForkJoinPool-1-worker-1的i值  301
ForkJoinPool-1-worker-5的i值  1601
ForkJoinPool-1-worker-4的i值  740
ForkJoinPool-1-worker-6的i值  1789
ForkJoinPool-1-worker-4的i值  741
ForkJoinPool-1-worker-6的i值  1790
ForkJoinPool-1-worker-0的i值  494
ForkJoinPool-1-worker-1的i值  302
ForkJoinPool-1-worker-6的i值  1791
ForkJoinPool-1-worker-3的i值  2165
ForkJoinPool-1-worker-6的i值  1792
ForkJoinPool-1-worker-2的i值  1430
ForkJoinPool-1-worker-7的i值  2991
ForkJoinPool-1-worker-0的i值  495
ForkJoinPool-1-worker-4的i值  742
ForkJoinPool-1-worker-5的i值  1602
ForkJoinPool-1-worker-0的i值  496
ForkJoinPool-1-worker-7的i值  2992
ForkJoinPool-1-worker-5的i值  1603
ForkJoinPool-1-worker-6的i值  1793
ForkJoinPool-1-worker-4的i值  743
ForkJoinPool-1-worker-1的i值  303
ForkJoinPool-1-worker-6的i值  1794
ForkJoinPool-1-worker-3的i值  2166
ForkJoinPool-1-worker-6的i值  1795
ForkJoinPool-1-worker-4的i值  744
ForkJoinPool-1-worker-2的i值  1431
ForkJoinPool-1-worker-0的i值  497
ForkJoinPool-1-worker-2的i值  1432
ForkJoinPool-1-worker-7的i值  2993
ForkJoinPool-1-worker-5的i值  1604
ForkJoinPool-1-worker-1的i值  304
ForkJoinPool-1-worker-3的i值  2167
ForkJoinPool-1-worker-6的i值  1796
ForkJoinPool-1-worker-3的i值  2168
ForkJoinPool-1-worker-4的i值  745
ForkJoinPool-1-worker-0的i值  498
ForkJoinPool-1-worker-4的i值  746
ForkJoinPool-1-worker-0的i值  499
ForkJoinPool-1-worker-2的i值  1433
ForkJoinPool-1-worker-7的i值  2994
ForkJoinPool-1-worker-5的i值  1605
ForkJoinPool-1-worker-7的i值  2995
······
RESULT_SET的大小=3000

‍ForkJoin线程池处理有返回值任务。

代码语言:javascript
复制
public class ForkJoinPoolTask {
    public static void main(String[] args) throws Exception {
        //需求:对于长度为10000的元素数组进行累加
        int[] nums = new int[10000];
        Random random = new Random();
        int total = 0;
        //初始化数组元素
        long start = System.nanoTime();
        for (int i = 0; i < nums.length; i++) {
            int temp = random.nextInt(100);
            nums[i] = temp;
            total += nums[i];
        }
        long end = System.nanoTime();
        System.out.println("初始化数组用时:" + (end - start) + "纳秒, 初始化数组总和:" + total);

        long startTask = System.nanoTime();
        //创建Task
        SumTask task = new SumTask(nums, 0, nums.length);
        //创建线程池
        ForkJoinPool pool = new ForkJoinPool();
        //提交任务,存在返回值
        ForkJoinTask<Integer> future = pool.submit(task);
        //显示结果
        long endTask = System.nanoTime();
        System.out.println("线程池计算用时:" + (endTask - startTask) + "纳秒, 线程池执行结果:" + future.get());
        //关闭多线程
        pool.shutdown();

    }
}

public class SumTask extends RecursiveTask<Integer> {
    /**
     * 每个小任务,最多只累加20个数
     */
    private static final int THRESHOLD = 20;
    private int nums[];
    private int start;
    private int end;

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

    @Override
    protected Integer compute() {
        int sum = 0;
        if (end - start < THRESHOLD) {
            for (int i = start; i < end; i++) {
                sum += nums[i];
            }
            return sum;
        } else {
            //当分块超过阈值时,则需要对数据进行拆分
            int mid = (start + end) / 2;
            SumTask leftTask = new SumTask(nums, start, mid);
            SumTask rightTask = new SumTask(nums, mid, end);
            //并行执行两个小任务
            leftTask.fork();
            rightTask.fork();
            //把两个小任务累加合并
            return leftTask.join() + rightTask.join();
        }
    }
}

执行结果如下。

代码语言:javascript
复制
初始化数组用时:1847192纳秒, 初始化数组总和:493016
线程池计算用时:4220889纳秒, 线程池执行结果:493016

第3节 两种线程池的比较


ThreadPoolExecutor——适用于IO密集型任务

1.HTTP

2.RPC

3.DB

4.Redis

5.MQ

6.ZK

ForkJoinPool——适用于CPU密集型任务

1.处理大量的商户信息

2.对一个10亿数字文本做排序

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档