简单使用线程池

线程池的概念

在java中提供了Executors类, 用来创建线程池, 大体分为如下几类:

    1. 创建一个固定大小的线程池
static ExecutorService newFixedThreadPool(int nThreads);
    1. 创建一个可缓存的线程池(可大可小)
static ExecutorService newCachedThreadPool()  
    1. 创建一个定时执行的线程池
    • scheduleAtFixedRate()
    • scheduleWithFixedDelay()
    • 区别:
      • scheduleAtFixedRate 固定周期执行, 不管上次的线程执行完成没有
      • scheduleWithFixedDelay 固定周期执行, 此方法会等待上次线程执行完成后按照周期执行
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)  
    1. 创建一个单线程执行的线程池
static ExecutorService newSingleThreadExecutor()  
    1. 创建一个单线程定时执行的线程池
static ScheduledExecutorService newSingleThreadScheduledExecutor()    
  • 代码如下
public static  void testFixedThreadPool() {
    //创建固定的线程池,使用3个线程来并发执行提交的任务。底层是个无界队列
    ExecutorService executorService = Executors.newFixedThreadPool(6);
    executorService.execute(new MyThread());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyThread());
    executorService.execute(new MyThread());
}
public static void testCacheThreadPool() {
    //创建非固定数量,可缓存的线程池。当提交的任务数量起起伏伏时,会自动创建或者减少执行线程的数量。
    //当然,重用线程是线程池的基本特征。
    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.execute(new MyThread());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyThread());
}

public static void testScheduledThreadPool(){
    //创建一个定时执行线程池
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(30);
    //1、配置任务的执行周期
    //scheduleAtFixedRate 固定周期执行完毕
    //每秒钟会调用MyRunnable任务, 不管这个MyRunnable有没有执行完成, 都是每秒执行
    executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
    //scheduleWithFixedDelay 上一次执行完毕之后下一次开始执行
    //每秒钟会调用MyRunnable任务, 当执行下一次任务, 会先上一次的任务有没有执行完成, 如果没有, 先等待, 当上一次的任务执行完成以后, 会等待1秒的时候, 执行下一次请求
    executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}
//----------以下了解即可--------------

public static void testSingleThreadPool() {
    //创建单线程,在任务执行时,会依次执行任务。底层是个无界队列。
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    //由于这个线程池只有一个线程, 所以以下的任务, 会依次执行
    executorService.execute(new MyThread());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyRunnable());
    executorService.execute(new MyThread());
}



public static void testSingleCacheThreadPool(){
    //创建一个单个线程执行的定时器
    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    //scheduleAtFixedRate 固定周期执行完毕
    //这个也是一个定时执行的线程池, 但是这个线程池中只有一个线程, 如果使用这个方法的话, 那么如果上一个线程没有执行完成, 会直接干掉这个任务吗, 重新执行任务
    executorService.scheduleAtFixedRate(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
    //scheduleWithFixedDelay 上一次执行完毕之后下一次开始执行
    executorService.scheduleWithFixedDelay(new MyRunnable(),0,1000,TimeUnit.MILLISECONDS);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章