我的Java笔记--线程池

缘由

由于涉及与操作系统的交互,构建一个新的线程是有一定代价的。如果程序中需要大量生命周期很短的线程,应该使用线程池。

线程池

一个线程池(thread pool)中包含许多准备运行的空闲线程,将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在线程池中准备为下一个请求提供服务。

使用线程池还可以减少并发线程的数目。创建大量线程会大大降低性能甚至使虚拟机崩溃,如果算法会创建许多线程,应该使用线程数固定的线程池,来限制并发线程的总数。

构建线程池

执行器(Executor)类的静态工厂方法能用来构建线程池。

方法描述
newCachedThreadPool必要时创建新进程;空闲线程会被保留60秒
newFixedThreadPool该池包含固定数量的线程;空闲线程会一直被保留
newSingleThreadExecutor只有一个线程的池,该线程顺序执行每一个提交的任务
newScheduledThreadPool用于预定执行而构建的固定线程池,替代java.util.Timer
newSingleThreadScheduledExecutor用于预定执行而构建的单线程池

newCachedThreadPool构建了一个线程池,对于每个任务,如果有空闲线程可用,立即让它执行任务,如果没有可用的空闲线程,则创建一个新线程。

newFixedThreadPool构建一个具有固定大小的线程池,如果提交的任务多于空闲的线程数,那么把得不到服务的任务放到队列中。当其他任务完成以后再运行它们。

newSingleThreadPool是大小为1的线程池,由一个线程执行提交的任务,一个接着一个。

上述三个方法返回实现了ExecutorService接口的ThreadPoolExecutor类的对象。而以下三个方法都可以将一个Runnable对象或Callable对象提交给ExecutorService

Future<?> submit(Runnable task)

该方法返回的是Future<?>,可以调用isDonecancelisCancelled,但是使用get方法时只能得到null

Future<T> submit(Runnable task, T result)

该方法也提交一个Runnable,并且Futureget方法在完成的时候返回指定的result对象。

Future<T> submit(Callable<T> task)

该方法提交一个Callable,并且返回的Future对象将在计算结果准备好的时候得到它。

使用线程池要做的事

  1. 调用Executors类中静态的方法newCachedThreadPool或newFixedThreadPool。
  2. 调用submit方法提交RunnableCallable对象。
  3. 如果想要取消一个任务,或如果提交Callable对象,那就要保存好返回的Future对象。
  4. 当不再提交任何任务时,调用shutdown

参考:《Java核心技术 卷1》 第14章 并发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值