execute()和submit(),Runnable和Callable,shutdown()和shutdownNow(),isTerminated()和isShutdown(),它们的区别是什么?

几个对比,execute()和submit()Runnable和Callableshutdown()和shutdownNow()isTerminated()和isShutdown()

execute()方法和submit()方法

共同点

  1. 都是将任务提交给线程池执行。
  2. 任务通常是一个实现了Runnable接口的实例,或者是实现了Callable接口的实例(execute()只支持Runnable,submit()都支持)。

区别

1、返回值:execute()方法,没有返回值,接收到Runnable对象就立即开始执行任务。由于没有返回值,所以不知道任务是否完成。submit()方法,返回一个Future对象。如果任务是Runnable类型,那么submit()返回的Future中的结果将是null。Future对象可以用于获取任务执行的结果、取消任务、检查任务是否已完成。(future的get()方法来获取返回值)

2、异常处理:execute()方法,抛出的异常会被线程池处理。submit()方法,抛出异常会被包装在返回的Future对象中。调用Future.get()时发现异常,捕获原始异常,然后在get()方法中加上异常处理的代码。

3、应用场景

execute()用于不需要返回结果的任务。submit()用于需要获取任务执行结果的任务,或者需要处理抛出的异常的任务。

Runnable和Callable

Runnable接口不会返回结果、抛出异常,Callable接口会返回结果、抛出异常。如果任务不需要返回结果、抛出异常,推荐使用Runnable接口,这样代码看起来会更加简洁。

shutdown()和shutdownNow()

shutdown():关闭线程池,线程池的状态变为 SHUTDOWN。线程池不再接受新任务,但是队列里的任务会执行完毕。

shutdownNow():关闭线程池,线程的状态变为 STOP。线程池线程池不再接受新任务,并且会终止当前正在运行的任务,停止处理排队的任务,并返回正在等待执行任务的List集合。 底层原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程。

isTerminated()和isShutdown()

isTerminated 当调用 shutdown() 方法后,并且所有提交的任务完成后,返回为 true。

isShutDown 当调用 shutdown() 方法后,返回为 true。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值