ScheduledThreadPool计划线程池的使用

package com.jiading.pool;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 延迟连接池,初始化时设置一个corePoolSize,如果线程数量超过这个大小,
 * 那么,当前线程就会进入阻塞队列中,直到其它线程用完之后,再获得被释放的池子执行任务
 * 那如果阻塞队列也满了怎么办,这就要看此时poolSize有没有达到maximunPoolSize,如果没有达到的话就新增线程来执行任务
 * 如果达到了的话,就表示线程池此时已经达到最大极限了,会拒绝新的任务,连池子都不进
 * 这不光是ScheduledThreadPool这样做,而是一个普遍的做法
 * 可以将corePoolSize理解为一个建议的大小
 *计划线程池使用的阻塞队列是DelayedWordQueue,它默认大小是16,但是可以动态增长,最大值则是int的最大值
 */
public class ScheduledThreadPool {
    public static void main(String[] args) throws InterruptedException {
        ScheduledExecutorService pool= Executors.newScheduledThreadPool(2);
        Thread t1=new MyThread();
        Thread t2=new MyThread();
        Thread t3=new MyThread();
        Thread t4=new MyThread();
        Thread t5=new MyThread();
        //将一部分线程放入池中执行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        //使用延迟执行风格
        //第二个参数是延迟的时间大小,第三个是单位
        pool.schedule(t4,10, TimeUnit.MILLISECONDS);
        //还有循环执行的功能
        //延迟10秒执行,2秒执行一次
        pool.scheduleAtFixedRate(t5,10,2,TimeUnit.SECONDS);

        /*
        注意如果要用延迟执行的话,就要谨慎使用pool.shutdown了。虽然shutdown不会直接关闭池子,而是要等内部正在运行的线程和等待队列中的线程运行完之后再停止
        但是,它此时也不会再接受外部submit的任务了。那么如果延迟执行的命令就在它上方,很可能这个线程就不会被执行
         */
        //pool.shutdown();
    }
}
class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println(Thread.currentThread().getName()+"正在执行");
    }
}

最后的循环执行如果不加干预的话,会一直执行下去

posted @ 2020-03-18 17:32  别再闹了  阅读(1826)  评论(0)    收藏  举报