【Java并发编程 线程池】28.ThreadPoolExcutor和自定线程池

线程池原理

线程池底层使用**堵塞式队列 BlockingQueue **。

队列遵从:先进先出,后进后出原则。
阻塞队列(BlockingQueue)和非阻塞队列(ConcurrentLinkedQueue )区别:

无界和有界队列:
ConcurrentLinkedQueue 是无界队列,不用设置长度,可以随便存放值(其实是jdk伪造的,最大长度是Integer的最大值)
BlockingQueue 是有界队列,需要设置长度。
注意:如果BlockingQueue 不设置等待时间就是非阻塞队列

存入:
非阻塞队列:如果存放超出了队列总数,添加不进去,就会丢失。
阻塞队列:如果存放超出了队列总数,进行等待,直到有队列出列,或者超时设置的等待时间)
获取:
非阻塞队列:如果为空时,返回空。
阻塞队列:如果为空时,进行等待,直到有新的队列入列,或者超过设置的等待时间


创建线程池的构造方法

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

ThreadPoolExecutor
参数说明
核心线程大小(corePoolSize)
最大线程大小(maximumPoolSize)
终止时间(keepAliveTime)
Unit 超时时间
workQueue 线程容器

自定义线程池

/**
* 自定义线程池
* @author terry
* @date 2018年5月28日
*/
public class ThreadExector3 {
 
    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                1,//核心线程
                1,//最大线程
                0L,//超时时间
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>()
                );
        pool.execute(new Task("任务一"));
        pool.execute(new Task("任务二"));
        pool.execute(new Task("任务三"));
        pool.execute(new Task("任务四"));
 
 
        pool.shutdown();
    }
 
}
class Task extends Thread{
 
    private String name;
 
    public Task(String name){
        this.name = name;
    }
 
    public void run(){
        System.out.println(Thread.currentThread().getName()+"正在执行,"+name);
    }
 
}

如果限制容器长度会报错:

new LinkedBlockingQueue<>(2)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

terrybg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值