如何正确的创建一个线程池并且将它用好

开始装逼

源头:这是我以前面试遇到的一个题目,给你们看一哈
a使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示:

1)继承Thread类创建线程

2)实现Runnable接口创建线程

3)使用Callable和Future创建线程

4)使用线程池例如用Executor框架

题目的答案是ABCD

关于多线程的创建问题,无论是从线程池中取出来还是怎么滴,源头只有 俩 就是上面的AB

好,现在开始说线程池

java 核心线程池 数量和cpu关系 线程池核心线程和_spring

线程池中的线程分为: 核心线程和非核心线程

java 核心线程池 数量和cpu关系 线程池核心线程和_spring_02

1.corePoolSize 指定了线程池里的线程数量 核心线程数,这些线程是一直存在不会被GC回收的。
2.maximumPoolSize 指定了线程池里的最大线程数量 这个就是所有线程的数量
3.keepAliveTime 当线程池线程数量大于corePoolSize时候,多出来的空闲线程,多长时间会被销毁。(设定一个时间,当有的非核心线程到达这个时间的零界点,回收销毁)
4.unit 时间单位 计算时间单位:代码找不到了
5.workQueue 任务队列,用于存放提交但是尚未被执行的任务。
6.threadFactory 线程工厂,用于创建线程,一般可以用默认的
7.handler 拒绝策略,当任务过多时候,如何拒绝任务。
拒绝策略的内容较多,这里暂且说一点:
当线程池满的时候,这时候,如果你再创建一个新的线程,那么就不可以了。会触发拒绝策略。

java 核心线程池 数量和cpu关系 线程池核心线程和_java 核心线程池 数量和cpu关系_03


CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。

FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程

JAVA提供了这四个创建线程的方法 。个人认为这个不必细看,点进去一看,我QTM,不就是 对我上面讲的 Executors构造器的封装么,整的这么高级!

我随便点一个看看

java 核心线程池 数量和cpu关系 线程池核心线程和_java 核心线程池 数量和cpu关系_04

对了 一定要说一个重要的事情,现在的开发 都是不允许 用Executor的四个静态方法搞线程的

因为 (阿里巴巴开发手册上看见的东西)

java 核心线程池 数量和cpu关系 线程池核心线程和_java_05


反正这些都不是重点,用我跟你说的这个方法,我贴个代码 先

`ThreadPoolExecutor ets=new ThreadPoolExecutor
    (5,10,10,
            TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(1));`

用这个方法创建线程池 。参数自己配,稳的很!

看到这里有的小朋友又以为自己会了,
到这里是创建线程池! 不是用线程,那么 该怎么用线程呢?
好说好说。来了

ets.execute(new Runnable() {
    @Override
    public void run() {

    }
});

用里面的方法体 就是要干的事情

关于线程与进程的区别, 线程是进程的其中一个组成部分,就像你电脑打开任务管理器,里面含有许多进程, 但是每个进程难道只有一个线程? 那不是胡扯么, 线程是一个微小的部分,

**重中之中:
线程的几种状态,网上有很多 有的五种,有的七八种的,都是虚的:
新建,就绪 运行 阻塞,死亡
新建一个新线程,是要来写代码, 线程的就绪关乎 什么时候启动线程,线程的运行是执行代码,线程的阻塞是你的业务,或者情况, 而线程的死亡为结束。

未完待续。。。。。
关于线程这一块儿,时间不多,其他的以后在补充。