Java中的多线程学习3:线程池
Java中的多线程学习三:线程池
---摘自高人
可以使用线程池对其进行管理,同时线程池还具有提高系统性能的优点,因为创建线程和清除线程的开销比较大。
有两种不同类型的线程池:一是固定线程数量的线程池;二是可变数量的线程池。
对于固定数量的线程池,可以使用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,判断是否完成
这上面,就是对线程池的大致总结。
---摘自高人
可以使用线程池对其进行管理,同时线程池还具有提高系统性能的优点,因为创建线程和清除线程的开销比较大。
有两种不同类型的线程池:一是固定线程数量的线程池;二是可变数量的线程池。
对于固定数量的线程池,可以使用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,判断是否完成
这上面,就是对线程池的大致总结。