首页 > 编程语言 > 详细

线程池 executor 和 executors

时间:2018-02-04 10:26:05      阅读:242      评论:0      收藏:0      [点我收藏+]

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是一个

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

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);
    
    }
}

 

 

 

 

线程池 executor 和 executors

原文:https://www.cnblogs.com/xiaobinggan/p/8407215.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!