spring boot学习笔记2-java 线程池

一、java 提供了两种创建线程池的方法,让我们来存放异步执行的线程。

1.使用 ThreadPoolExecutor类对象创建,根据向构造函数中传入参数的不同,来创建不同的线程池。

具体为:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);

corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 超出核心线程数小于最大线程数的时候,线程空闲时间。超过即被销毁。
TimeUnit 时间单位

2.使用Executor类对象创建线程池

应用Executors创建线池四种方式
Executors.newCachedThreadPool();        //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE
Executors.newSingleThreadExecutor();   //创建容量为1的缓冲池
Executors.newFixedThreadPool(int);    //创建固定容量大小的缓冲池,超过容量的会进入队列等待
newScheduledThreadPool(int)           //创建固定容量大小的缓冲池,支持定时及周期性任务执行。

ExecutorServicejava线程池的接口

二、线程的执行方式和线程池的关闭方式

java提供从两种线程执行方法execute()和submit()

主要区别是execute()没有返回值而submit()会返回一个future对象

shutdown()会把线程池置为shutDown状态,但不会中断正在运行的线程。

shutdownNow()会把线程池置为stop状态,并中断正在运行的线程

三、示例参考

public class TaskExcutor {

    public static void main(String[]args){
        ThreadPoolExecutor excutor = new ThreadPoolExecutor(10,20,200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(20));
  
        ExecutorService executors = Executors.newFixedThreadPool(10);



        for(int i =0;i<30;i++){
            MyTask task = new MyTask(i);
            //excutor.execute(task);
            //executors.execute(task);//execute 没有返回值
           Future future = executors.submit(task); //submit  执行线程有返回值,返回一个future对象
            System.out.println(future);//如果线程执行完了会返回一个null

           // System.out.println("线程池中线程数:"+excutor.getPoolSize()+",队列中等待执行的任务数:"+excutor.getQueue().size()+",已执行完成的任务数目:"+excutor.getCompletedTaskCount());


        }
        excutor.shutdown();
    }



}
class MyTask implements Runnable{

    private int taskNum;

    /**
     * 声明一个有参数的构造方法
     * @param num
     */
    public  MyTask(int num){
        this.taskNum = num;
    }

    public void run(){
        System.out.println("正在执行的task"+taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("执行完毕的task"+taskNum);
    }


}

运行结果


参考地址:

https://www.cnblogs.com/dolphin0520/p/3932921.html

http://ifeve.com/java-threadpool/

https://www.cnblogs.com/ljp-sun/p/6580147.html

http://blog.csdn.net/suifeng3051/article/details/49443835

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值