Java中的多线程学习三:线程池

本文介绍了线程池的基本概念,包括固定数量和可变数量线程池的特点及使用方式,并探讨了延迟线程池的功能。此外,还讨论了如何通过ThreadPoolExecutor创建自定义线程池,以及Callable和Future接口在获取线程执行结果方面的应用。

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

可以使用线程池对其进行管理,同时线程池还具有提高系统性能的优点,因为创建线程和清除线程的开销比较大。

 

有两种不同类型的线程池:一是固定线程数量的线程池;二是可变数量的线程池。

 

对于固定数量的线程池,可以使用Executors的静态方法 newFixedThreadPool 来创建 ExecutorService;或者利用 newSingleThreadPool来创建。

 

而 ExecutorService 实现了 Executor 接口,这个接口中有一个方法:Execute(Runnable command),也就是执行线程。

 

对于固定数量的线程池而言,如果需要执行的线程数量多于构造的数量,那么只能并发构造时的数量,剩下的线程就进入线程池的等待队列。

 

如果不需要使用该线程池了,则使用 ExecutorService 中的 shutDown 方法,此时,该线程池就不会接受执行新的线程任务了。

 

 

 

对于可变数量的线程池,可用Executors的静态方法 newCachedThreadPool 来创建 ExecutorService,该线程池的大小是不定的,当执行任务时,会先选取缓存中的空闲线程来执行,如果没有空闲线程,则创建一个新的线程,而如果空闲线程的空闲状态超过60秒,则线程池删除该线程。

 

 

还有一种线程池:延迟线程池

 

该线程池的创建有两个方法: Executors.newScheduledThreadPool(int corePoolSize);

                                        Executors.newSingleScheduledExecutor();

 

创建之后,会获得一个 ScheduledExecutorService。

 

该对象的一个重要的方法就是: schedule(Runnable command, long delay, TimeUnit unit)

 

该方法返回了一个 ScheduledFuture(下面再讲)。

 

 

 

另外,如果要创建一个自定义的线程池,还可以使用ThreadPoolExecutor这个类,主要的构造方法如下:

 

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,

                                 BlockingQueue<Runnable> wordQueue)

 

其中各参数的意义:

  1. int corePoolSzie: 定义线程池的标准线程数量
  2. int maximumPoolSize: 定义线程池的最大线程数量
  3. long keepAliveTime: 定义空闲线程的存活时间
  4. TimeUnit unit: 存活时间的单位
  5. BlockingQueue<Runnable> WordQueue: 线程等待的队列

 

 

 

现在总结一下Callable和Future两个接口

 

Callable接口和Runnable接口相似,区别就是Callable需要实现call方法,而Runnable需要实现run方法;并且,call方法还可以返回任何对象,无论是什么对象,JVM都会当作Object来处理。但是如果使用了泛型,我们就不用每次都对Object进行转换了。

 

 

Future接口,一般都是取回Callable执行的状态用的。其中的主要方法:

  • cancel,取消Callable的执行,当Callable还没有完成时
  • get,获得Callable的返回值
  • isCanceled,判断是否取消了
  • isDone,判断是否完成

 

这上面,就是对线程池的大致总结。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值