线程池 executor 和 executors

2018-06-18 03:29:19来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

Executor是Java线程池的顶级接口

接口中最核心的一个类:ThreadPoolExecutor 中的构造方法: 

public ThreadPoolExecutor(int corePoolSize,    // 10
    int maximumPoolSize,     // 10
    long keepAliveTime,   // 0L
    TimeUnit unit,   // 时间单位
    BlockingQueue<Runnable> workQueue   //  队列)

第一个参数:corePoolSize - 池中所保存的线程数,包括空闲线程。 表示这个线程池一旦初始后,就存在了多少个线程。

第二个参数:maximumPoolSize - 池中允许的最大线程数。当前这个线程池最大线程数。

第三个参数:keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。当前线程空闲时间是多少,比如为0L,表示这个线程一旦执行完,直接回收,不做停留,不做任何空闲

第四个参数:unit - keepAliveTime 参数的时间单位。第三个参数与第四个参数是一起用的

第五个参数:workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。 如果没有空闲线程,任务将被暂缓到这个队列里面。

 

Executors是类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口。

Executors几个重要方法:

callable(Runnable task): 将 Runnable 的任务转化成 Callable 的任务

newSingleThreadExecutor(): 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。

newCachedThreadPool(): 产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。

newFixedThreadPool(int poolSize): 产生一个ExecutorService对象,这个对象带有一个大小为 poolSize 的线程池,若任务数量大于 poolSize ,任务会被放在一个 queue 里顺序执行。

newSingleThreadScheduledExecutor(): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为 1 ,若任务多于一个,任务将按先后顺序执行。

newScheduledThreadPool(int poolSize): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为 poolSize ,若任务数量大于 poolSize ,任务会在一个 queue 里等待执行。

1,Executors.newFixedThreadPool(int nThreads)  //  创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。

外界传一个参数比如 10,  那么初始化10个线程,并且最大线程数量也是10,如果没有空余线程执任务时,任务将暂缓到这个无界队列中。

2,newCachedThreadPool() //创建一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,如果来了一个任务,就创建一个线程,若无任务则不创建线程,并且每个线程会在60秒后自动回收

第一个参数,coreSize 为0,表示这个线程初始化时,是不创建线程的。开始是没有任何线程的

第二个参数, 表示 可以装多少个线程,Integer.MAX_VALUE    不限定多少个线程  

第三,四个参数,表示60秒,比如一个任务执行完成后,该线程不立即回收,等待60秒后,看是否有第二个任务,如果有继续执行,如果没有,就回收。所以这边叫做CachedThreadPool。带有缓存的意思。

synchronousQueue<Runnable>()

3, Executors.newScheduledThreadPool(int corePoolSize)  创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行


具体用法: 一个小例子
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

class Temp extends Thread {
    public void run() {
        System.out.println("run");
    }
}

public class ScheduledJob {
    
    public static void main(String args[]) throws Exception {
    
        Temp command = new Temp();
        
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        // command代表一个任务,5 代表 初始化时延迟5秒执行这个任务,1代表 每隔1 秒轮询着执行这个任务,最后是时间单位,这里是秒
        ScheduledFuture<?> scheduleTask = scheduler.scheduleWithFixedDelay(command, 5, 1, TimeUnit.SECONDS);
    
    }
}

 

 

 

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:NIO笔记---上

下一篇:请求转发和请求包含和重定向之间的区别