线程池工作笔记
2016-03-19 10:31
357 查看
----------------第一篇博客----------------------
从毕业到正式工作也有小半年了。新公司挺不错,除了太闲点。虽然没做什么项目,但是想着养成整理学习笔记的好习惯,自己也尝试抽出空余的时间来写博客。写博客主要是起自我监督,其次是分享,so,写的零零散散,语言组织不好,想到哪儿写到哪儿,也有可能存在错误,望可能存在的读者见谅并指正。感谢查漏补缺,先整理下前段时间做线程池的笔记吧。
一、ExecutorService
(1) 线程池的创建
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }Executors封装了四种创建线程池的方法。
1.固定线程池大小的线程池,thread_num为最大创建的线程数量。使用的队列为无界队列,如果所有线程都在执行任务,继续向线程池中提交任务会在队列中等待。
Executors.newFixedThreadPool(thread_num);
2.缓存型线程池CachedThreadPool()
3.调度型线程池ScheduledThreadPool()
4.单例线程池SingleThreadExecutor()
这四种都是使用默认的线程池工厂,也可以自己实现接口写工厂。
static class DefaultThreadFactory implements ThreadFactory { static final AtomicInteger poolNumber = new AtomicInteger(1); final ThreadGroup group; final AtomicInteger threadNumber = new AtomicInteger(1); final String namePrefix;<p> DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null)? s.getThreadGroup() :Thread.currentThread().getThreadGroup(); namePrefix = “pool-” + poolNumber.getAndIncrement() + “-thread-“; }</p><p> public Thread newThread(Runnable r) { Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t; } }</p>(2)guava提供的ListeningExecutorService
ListeningExecutorService listeningDecorator = MoreExecutors .listeningDecorator(Executors.newFixedThreadPool(thread_num));
ListeningExecutorService可以添加回调方法。参见点击打开链接
(3)线程池提交任务的方法
1.executorService.submit()
提交任务到线程池。
2.executorService.invokeAll(Collection task)
// 等待所有任务执行完成才会返回的线程阻塞方法 List<ListenableFuture<T>> listenableFuture = (List) executorService.invokeAll(tasks); // 设置回调方法(invokeAll返回的Future是和提交的任务顺序是一致的) for (int i = 0; i < listenableFuture.size(); i++) { Futures.addCallback(listenableFuture.get(i),new FutureCallback<T>() { @Override public void onSuccess(T result) { // TODO Auto-generated method stub } @Override public void onFailure(Throwable t) { // TODO Auto-generated method stub } }); }
提交一个任务集合到线程池中。这是一个线程阻塞的方法,查阅资料,证明拿到的Future和提交的任务顺序是一致的。
相关文章推荐
- 【追求进步】二进制中1的个数
- Http中的Post和GET请求的区别
- 利用session防止用户未经登录而直接访问
- ElasticsearchIllegalArgumentException[failed to find analyzer [ik]]问题解决
- OpenGL ES 2.0 变换
- OpenGL ES 2.0 摄像机与投影
- codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序
- 一个iOS 框架介绍:MKNetworkKit
- Android 内存泄漏总结
- OpenGL ES 2.0 内置变量
- 第一个Struts2程序
- 浅谈 const 与 define 的区别(PHP)
- UNIX - 标准I/O库
- 部分控件总结
- 朝花夕拾之Oracle11g 表分区
- Android Light开发(一)
- MFC定时器使用(CWnd::SetTimer)
- Java程序StringBuilder的效率,验证字符串操作和字符串生成器的操作效率
- map()函数
- OpenGL ES 2.0 向量