实现自定义线程池(ExecutorService/Callable)
2021-03-02 21:40:59 0 举报
AI智能生成
自定义线程池(ExecutorService/Callable)
作者其他创作
大纲/内容
阅读导航
线程 👉
CPU+JMM 👉
CAS+Volatile 👉
Synchronized 👉
JUC
locks锁+atomic原子类 👉
executor自定义线程池
collections并发容器 👉
tools并发工具类 👉
线程池 👉
ThreadLocal 👉
executor
Future
RunnableFuture
FutureTask
启动和取消运算
查询运算是否完成
取回运算结果
SwingWorker
CompletableFuture
supplyAsync():用来开启一个异步任务(有返回值)
thenCompose():当第一个任务完成时才会执行第二个任务,开启新线程,最终结果由第二个任务返回
thenCombine():两个异步任务全部完成时才会执行某些操作,用来合并两个任务,结果由BiFunction()函数返回
ScheduledFuture
Callable
Callable接口类似于Runnable,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后可以返回值,这个
返回值可以被Future拿到,也就是说Future可以拿到异步执行任务的返回值
返回值可以被Future拿到,也就是说Future可以拿到异步执行任务的返回值
实现Callable接口
重写call方法,有返回值,可抛异常
需要用FutureTask在外部封装一下再传递给
Thread,FutureTask就是Runnable的实现类
Thread,FutureTask就是Runnable的实现类
FutureTask使用场景?
两件事或多件事同时完成
FutureTask两个个构造函数?
第一个构造函数要求传入Callable对象
第二个构造函数要求传入Runnable对象和返回值类型
FutureTask的其他方法?
get()
会一直等待子线程运行结束
get(5,TimeUnit.SECOND)
传入等待时间,超时后会抛出TimeoutException异常,需要捕捉处理
isDone()
询问子线程是否执行完成,返回值是boolean
优点
在主线程中可获取到子线程的返回值
直接调用FutureTask对象的get()方法
为什么可以获取到?如何获取的?
在主线程中可获取到子线程发生的异常
通过getCause()方法获取子线程的异常
代码实现
Executor
ExecutorService
AbstractExecutorService
ThreadPoolExecutor
ScheduledExecutorService
ScheduledThreadPoolExecutor
RejectedExecutionHandler
拒绝策略
拒绝策略
ThreadPoolExecutor.AbortPolicy
ThreadPoolExecutor.CallerRunsPolicy
ThreadPoolExecutor.DiscardOldestPolicy
ThreadPoolExecutor.DiscardPolicy
execute() 和 submit() 的区别?
execute()是Executor接口中的方法,submit()是ExecutorService中的方法
submit()方法中调用了execute()方法,增加了FutureTask返回值
关于作者
我的博客 👉
微信公众号 👉
GitHub 导航 👉
ProcessOn 主页 👉
0 条评论
下一页