线程池的状态、submit()和execute()方法的区别

一、线程池的结构

1、线程池管理器(ThreadPoolManager):用于创建并管理线程池
2、工作线程(WorkThread): 线程池中线程
3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。

二、线程池的5种状态

Running、ShutDown、Stop、Tidying、Terminated。

线程池各个状态切换框架图:
在这里插入图片描述
RUNNING:线程池的初始化状态,接受新的任务,处理等待队列中的任务。线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。

SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。

STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。调用线程池的shutdownNow()方法时,线程池由(RUNNING or SHUTDOWN ) -> STOP。

TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。因为terminated()在ThreadPoolExecutor类中是空的,所以用户想在线程池变为TIDYING时进行相应的处理;可以通过重写terminated()函数来实现。

当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。

当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

TERMINATED:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。

三、线程池的submit()和execute()方法的区别

 线程池中提交线程的时候其实有两种方法,一种是execute()另外一种是submit()。这两个方法的区别主要体现在三个方面:
(1)接收的参数不同;
(2)submit()有返回值,execute()没有;
(3)submit()方法便于Exception处理。

3.1 execute()

  execute()提交的方式只能提交一个Runnable的对象,且该方法的返回值是void,也就是提交后如果线程运行后,和主线程就脱离了关系了,当然可以设置一些变量来获取到线程的运行结果。并且当线程的执行过程中抛出了异常通常来说主线程也无法获取到异常的信息的,只有通过ThreadFactory主动设置线程的异常处理类才能感知到提交的线程中的异常信息。

3.2 submit()

submit()提交的方式有如下三种情况

1、 Future<T> submit(Callable<T> task);

  这种提交的方式是提交一个实现了Callable接口的对象,Callable接口的定义如下:

public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

  可以看到Callable接口和Runnable接口的定义很类似,只不过Runnable接口中是一个没有返回值的run方法,而Callable接口中是一个有返回值的call方法。

  这种提交的方式会返回一个Future对象,这个Future对象代表这线程的执行结果。

  当主线程调用Future的get方法的时候会获取到从线程中返回的结果数据。

  如果在线程的执行过程中发生了异常,get会获取到异常的信息。

2、Future<?> submit(Runnable task);

  也可以提交一个Runable接口的对象,这样当调用get方法的时候,如果线程执行成功会直接返回null,如果线程执行异常会返回异常的信息

3、 Future<T> submit(Runnable task, T result);

  这个接口就比较有意思了,除了task之外还有一个result对象,当线程正常结束的时候调用Future的get方法会返回result对象,当线程抛出异常的时候会获取到对应的异常的信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值