线程池工作笔记

来源:互联网 发布:eclipse Python django 编辑:程序博客网 时间:2024/05/02 09:34

----------------第一篇博客----------------------

从毕业到正式工作也有小半年了。新公司挺不错,除了太闲点。虽然没做什么项目,但是想着养成整理学习笔记的好习惯,自己也尝试抽出空余的时间来写博客。写博客主要是起自我监督,其次是分享,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和提交的任务顺序是一致的。

0 0