传智播客-多线程(7)-线程池

jdk5的并发类库里提供了一个重要的功能:线程池。

 

关于线程池的讲解,首先介绍在Tcp服务器编程模型的原理:对每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程。这好比假设一个公司(服务端)的每个应聘者(客户端连接)都要通过招聘专员(线程)来接待,这个招聘专员在他负责的这个应聘者的整个应聘流中都要存在。

 

如果访问服务器的客户端很多,那么服务器要不断地创建和销毁线程,这将严重影响服务器的性能。如果每来一个应聘者,公司都安排一名新招聘专员为之服务,是不可能的,那公司岂不是要招聘很多工作人员?而是应该一名工作人员服务完一名应聘者,空闲下来后,一旦有新的应聘者要服务,公司又立即安排该工作人员为新应聘者服务。线程池的概念与此类似,首先创建一些线程,它们的集合称为线程池,当服务器接受到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完后不关闭该线程,而是将该线程还回到线程池中。

 

在jdk5推出线程池之前,如果用api直接手写一个线程池程序是很难的。虽然我们可以利用new Thread()和while(true)来模拟实现线程池的功能,但是这是远远不够的,使用线程池的目的之一是提高性能,线程池里的线程数量确定,线程启动和关闭的条件,线程的生命周期,预留线程等等都要考虑,这样就增加了线程池程序开发的复杂度,所以很难实现。

 

jdk5里创建一个线程池使用的是Executors:
Executors.newFixedThreadPool(n)-->创建固定线程池,该池的线程启动数目是既定的,返回对象是ExecutorService;
Executors.newCachedThreadPool()-->创建缓存线程池,该池根据访问需求创建线程,当一个新的访问来临,如果之前的线程有空闲的,则分配到这个空闲线程,如果没有则新建一个,返回对象是ExecutorService;
Executors.newSingleThreadExecutor()-->创建单一线程池,等效于Executors.newFixedThreadPool(1),返回对象是ExecutorService;
Executors.newScheduledThreadPool()-->创建可调度线程池,该池根据时间调度需求创建线程,可以自定义什么时候开始创建线程,间隔多久循环创建线程,返回对象是ScheduledExecutorService;需要提醒的是,“自定义什么时候开始创建线程”是指的相对线程的创建时间,如果想自定义一个绝对时间(譬如某年某月某日某个时间点)创建线程任务,可以采用“date.getTime()-System.currentTimeMillis()”方式变通实现该需求。

 

固定线程池、缓存线程池和单一线程池的启用可以用submit()和execute()方法,可调度线程池的启用除了这两种方法,还可以采用schedule();关闭可以采用shutdown()、shutdownNow(),shutdown()表示调用该句时,不再接收任务,等待之前接收的任务完成之后再关闭线程池;shutdownNow()表示不管任务完成没有,调用该句时立即关闭线程池。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值