线程池 executor 和 executors

稀土 2018-02-04

Executor是Java线程池的顶级接口

线程池 executor 和 executors

接口中最核心的一个类: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是一个

Executors类提供了若干个静态方法,用于生成不同类型的线程池:

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

线程池 executor 和 executors

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

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

线程池 executor 和 executors

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

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

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

synchronousQueue<Runnable>()

3,

Executors.newScheduledThreadPool(int corePoolSize)  创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行<br /><br />具体用法: 一个小例子
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);
    
    }
}

相关推荐