7. 详解线程池:自定义线程池,JDK自带线程池,ForkJoin,源码解析等(一)

这篇博客深入探讨了并发编程的各种机制和工具,包括`synchronized`、`LockSupport`、`ReentrantLock`、`CountDownLatch`以及自旋锁的概念。同时,介绍了`BlockingQueue`的工作原理,如`put`和`take`方法如何实现线程阻塞。此外,还详细讲解了`Executor`、`ExecutorService`和`ThreadPoolExecutor`在创建和管理线程池中的作用。博客进一步阐述了`Callable`、`Future`以及`FutureTask`在异步任务执行中的应用,并展示了`CompletableFuture`如何优雅地管理多个异步任务的结果。通过实例展示了`CompletableFuture`的使用,包括`allOf`方法等待所有任务完成以及`thenAccept`链式调用来处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交替打印1a2v3c4d…
  • synchronized

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmgY7Ltd-1627494063249)(http://note.youdao.com/yws/res/7181/WEBRESOURCE8eba719b2769975a52e0d023d0f3cdc8)]

  • LockSupport

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvbFj2ny-1627494063251)(http://note.youdao.com/yws/res/7179/WEBRESOURCE56cd4769f26979f34af6c8e3f3eae520)]

  • ReenrantLock

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOxHazK6-1627494063252)(http://note.youdao.com/yws/res/7191/WEBRESOURCE96b9d73c8faf9a8186d73f77d78538de)]

  • CountDownLatch || 自旋

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ae0TkC1R-1627494063253)(http://note.youdao.com/yws/res/7189/WEBRESOURCE47844846a8845a8d4b8da2ab626fb283)]

  • CAS

    占用CUP

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g64xzF7Y-1627494063253)(http://note.youdao.com/yws/res/7195/WEBRESOURCE62a0dd2702cf34e76a7a7675d1f07977)]

  • BlockQueue

    • 使用put和tack方法,放满了阻塞,取完了阻塞

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6NAmiRh-1627494063254)(http://note.youdao.com/yws/res/7203/WEBRESOURCEcb446499b55488dd750e0def3bcab03a)]

  • Exchange

    输出谁先执行不一定!!!
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZnzb3NZ-1627494063255)(http://note.youdao.com/yws/res/7211/WEBRESOURCE493c877cf69cd28c4db4a67a4b09fcb7)]

  • transferQueue

    把自己的交给对方打印
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yoZBYNI-1627494063255)(http://note.youdao.com/yws/res/7213/WEBRESOURCE521b9ae97edb9dc467e8028d7bdcd4b9)]

ThreadPool 线程池

  • 三大类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzWNmp4R-1627494063255)(http://note.youdao.com/yws/res/7220/WEBRESOURCE62dc2241276b1db2af53e23508e7293e)]

Executor:定义了线程的执行接口;
ExecutorService:继承Executor类,并且完善了整个线程池的生命周期;
ThreadPoolExecutor:
Callable
  • 类似于rennable,但是有返回值
Future
  • 存储将来将要产生的结果
        Callable<String> c = new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "Hello Callable";
            }
        };

        ExecutorService service = Executors.newCachedThreadPool();
        Future<String> future = service.submit(c);//异步提交
        System.out.println(future.get());//阻塞方法,获得返回值

        service.shutdown();
FutureTask
  • Future + Runnable;
        FutureTask<String> futureTask = new FutureTask<>(() -> {
            return "Hello Callable  Lambda!";
        });
        new Thread(futureTask).start(); //Future与Runnable的结合;
        System.out.println(futureTask.get());
CompletableFuture
  • 管理多个Future的结果
public class CompletableFutureTest {
    public static void main(String[] args) {
        Long start =System.currentTimeMillis();
        CompletableFuture<Double> completableFuture = CompletableFuture.supplyAsync(new Supplier<Double>() {
            @Override
            public Double get() {
                return null;
            }
        });
        CompletableFuture TM = CompletableFuture.supplyAsync(()->getTM());
        CompletableFuture TB = CompletableFuture.supplyAsync(()->getTB());
        CompletableFuture JD = CompletableFuture.supplyAsync(()->getJD());
        CompletableFuture.allOf(TM,TB,JD).join();
        Long end =System.currentTimeMillis();
        System.out.println(end-start);

    }
    static Double getTM(){
        return 1.00;
    }
    static Double getTB(){
        return 2.00;
    }
    static Double getJD(){
        return 3.00;
    }
}
public class CompletableFuture_02 {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(()->getTM())
                .thenAccept(String::valueOf)
                .thenAccept(str -> "price : "+str)
                .thenAccept(System.out::println);
    }
    static Double getTM(){
        return 1.00;
    }
    static Double getTB(){
        return 2.00;
    }
    static Double getJD(){
        return 3.00;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值