zoukankan      html  css  js  c++  java
  • Java多线程Executors框架

    1.之前实现线程有三种方式 

      继承Thread类,实现Runnable或者Callable接口。

      如果实现Runnable或者Callable接口,需要Thread帮我们启动,但是现在提供了Executor帮助我们管理并执行实现了Runnable和Callable的类。

    2.Executor的继承关系

      

    其中Executor接口是提供了一种方法execute(Runnable run)用来执行定义的任务;

    public interface Executor {
    
        /**
         * Executes the given command at some time in the future.  The command
         * may execute in a new thread, in a pooled thread, or in the calling
         * thread, at the discretion of the <tt>Executor</tt> implementation.     */
        void execute(Runnable command);
    }

    接口ExecutorServices实现了Executor接口,但是没有实现executue()方法;并提供了submit()方法执行任务;

    public interface ExecutorService extends Executor {
         /**
         * Submits a Runnable task for execution and returns a Future
         * representing that task. The Future's <tt>get</tt> method will
         * return the given result upon successful completion.
         *
        使用submit()方法提交要执行的任务,
        返回Future对象,Future保存的是其他线程异步执行的结果;
        如果不需要返回结果的话,可以调用ThreadPoolExecutor实现的execute()方法执行任务;
    */
        <T> Future<T> submit(Callable<T> task);
     }
    ThreadPoolExecutor实现了Executor接口
    public class ThreadPoolExecutor extends AbstractExecutorService {
         /**  
    ThreadPoolExecutor的构造函数,用来创建一个线程池
    corePoolSize:线程池的大小
    maxinumPoolSize:线程池中允许同时执行的最多线程数;
    keepAliveTime:如果线程池中线程的数量>corePoolSize,且超过的部分线程空闲时间>keepAliveTime会被销毁;
    unit:keepAliveTime的单位;
    workQueue:在任务被执行之前持有任务直到任务被执行;
    如果线程池中的线程数量<corePoolSize,有新任务到来新建线程执行;如果线程数量>corePoolSize,将新任务放入队列中,等待执行;如果队列已满且线程数量<maxinumPoolSize,新建
    线程执行任务;
    */ public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; } /** ThreadPoolExecutor了execute方法,具体实现细节以后再说    **/ public void execute(Runnable command) { if (command == null) throw new NullPointerException(); int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return; c = ctl.get(); } if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); if (! isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); } else if (!addWorker(command, false)) reject(command); } }

    除了上面的几个类或接口之外,还有一个比较重要的类 Executors;该类是一个工厂类,能够产出几种不同的线程池;

    public class Executors {
    /*
    * 利用ThreadPoolExecutor生成固定的线程池
    */
      public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
        }
    /**
    *这个线程池可以重用重用线程,当线程池没有可用的线程时,新建线程;如果一个线程超过60s没有被使用,那该线程将从线程池中移除;
    **/
     public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
        }
    }
  • 相关阅读:
    AcWing 3772. 更新线路(BFS)
    AcWing 3760. 最大剩余油量(树的最长路径)
    AcWing 3771. 选取石子
    洛谷P2014—选课(树形DP)
    吴恩达机器学习ex1
    洛谷P1122—最大子树和(树形DP)
    论文中关于要使用600线的python代码
    mysql 笛卡尔积
    mysql 外键
    写参考文献有感
  • 原文地址:https://www.cnblogs.com/zhihuayun/p/7245065.html
Copyright © 2011-2022 走看看