heima并发17---并发工具(2)---线程池种类前三个基本的--209-214

int是4个字节32位。

带正负号的。

runniing

shutdown是比较温和的,就是正在执行的和阻塞队列的都不会停止的。

stop:暴力的停止,全部interrupt。

tidying:

terminated:

--------------------------------------------------------------------------------------------------------------

为什么用一个整数而不是两个整数呢?

---209---

我们看下构造方法:

参数:核心线程数 最大线程数 生存时间 时间单位 阻塞队列(放任务的) 线程工厂 拒绝策略。

我们的自己写的线程池的线程的创建是用到的时候才创建,任务队列没有任务就马上释放掉。

救急线程=max-核心线程,救急完毕了生存时间到了就被解雇了。

核心线程一直存在在线程池的,任务执行完了也是存在的。

---210---

救急线程的前提是配合有界队列使用的。

jdk的四种:

---211---

几种线程池:

1.newFixedThreadPool

举例:

注意一点:和手写线程池不一样,这个是不会主动结束的,我们要手动结束的,核心线程是不会主动结束自己的。

线程工厂的作用就是给线程起一个好的名字:

特点总结:无救急线程,阻塞队列无界,适用于任务数量已知的耗时任务。

---212---

2.带缓冲功能的线程池

理解:https://blog.csdn.net/qq_36299025/article/details/89490858

新的队列:SynchronousQueue。

package cn.itcast.n8;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.SynchronousQueue;

import static cn.itcast.n2.util.Sleeper.sleep;

@Slf4j(topic = "c.TestSynchronousQueue")
public class TestSynchronousQueue {
    public static void main(String[] args) {
        SynchronousQueue<Integer> integers = new SynchronousQueue<>();
        new Thread(() -> {
            try {
                log.debug("putting {} ", 1);
                integers.put(1);
                log.debug("{} putted...", 1);

                log.debug("putting...{} ", 2);
                integers.put(2);
                log.debug("{} putted...", 2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1").start();

        sleep(1);

        new Thread(() -> {
            try {
                log.debug("taking {}", 1);
                integers.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t2").start();

        sleep(1);

        new Thread(() -> {
            try {
                log.debug("taking {}", 2);
                integers.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t3").start();
    }
}

put是阻塞的直到有take才会put成功。没有线程来取你的放的线程是放不进去队列的。

总结:全部都是救急线程(60s释放),阻塞队列没有容量,取任务时候才会放进去任务。任务密集,时间短。

---213---

 

我们举个例子为什么我们自己去创建不好呢,即使出现异常也是始终有一个可用的线程。。

源码,看下对外暴露得到方法:

---

单线程线程池和固定线程线程池设置为1的区别,单线程的不可以随便改的。

---214---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值