概述
1.ThreadPoolExecutor
2.ForkJoinPool
3.ThreadPoolExecutor VS ForkJoinPool
第1节 ThreadPoolExecutor
ThreadPoolExecutor执行无返回值的任务。
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 + "]";
}
}
}
执行结果如下。
线程-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执行有返回值的任务。
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);
}
}
执行结果如下。
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线程池处理无返回值任务。
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;
}
}
执行结果如下。
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线程池处理有返回值任务。
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();
}
}
}
执行结果如下。
初始化数组用时:1847192纳秒, 初始化数组总和:493016
线程池计算用时:4220889纳秒, 线程池执行结果:493016
第3节 两种线程池的比较
ThreadPoolExecutor——适用于IO密集型任务
1.HTTP
2.RPC
3.DB
4.Redis
5.MQ
6.ZK
ForkJoinPool——适用于CPU密集型任务
1.处理大量的商户信息
2.对一个10亿数字文本做排序