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---