线程(八)线程池

一、线程池

1、什么是线程池?
答:
    经常创建、启动销毁一个线程都是非常消耗时间的。
    使用线程池进行管理和复用线程,提高程序效率。
 
面试答:
Java线程池能带来的3个好处:
 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
 2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
 3、提高线程的可管理性。线程是稀缺资源,如果无限制地创建,
 不仅会消耗系统资源。还会降低系统的稳定性。
 使用线程池可以统一分配、调优和监控,但是要合理利用。
 
Java使用线程核心走的是ThreadPoolExecutor。(构造函数)

二、使用线程池的方式

使用线程池的方式:
使用Executor 封装好的四种线程池类型。
1、newCachodThreadPool创建一个可以缓存线程池,如果线程池长度超过处理需要
,可灵活回收空闲线程,若无可回收,则新建线程。
2、newFixedThreadPool 创建一个定长的线程池。可控制线程最大并发数,超出的
线程会在队列中等待。
3、newFixedThreadPool 创建一个定长的线程池。
4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作
线程来执行任务。

三、线程池合理配置

CPU密集、IO密集。

四、4种创建线程池的方式

1、newCachedThreadPool 创建可以缓存的线程池

package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * @classDesc: 功能描述:(线程池四种创建方式 newCachedThreadPool 创建可缓存的线程池)
 */
public class NewCachedThreadPoolDemo {
    public static void main(String[] args) {
        // 1、创建可缓存的线程池 可以重复的利用
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newCachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}

显示结果:本来程序是创建10个线程,这里就创建了7个,说明有3个在复用

è¿éåå¾çæè¿°

2、newFixedThreadPool:创建固定长度的线程池

package com.leeue;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 
 * @classDesc: 功能描述:(可固定长度的线程池  newFixedThreadPool)
 */
public class newFixedThreadPoolDemo {
    public static void main(String[] args) {
        //快捷键 ctrl+2 +F 来创建变量名
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newFixedThreadPool.execute(new Runnable() {
 
                @Override
                public void run() {
                System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
                }
            });
        }
 
    }
}

è¿éåå¾çæè¿°

3、newScheduledThreadPool:创建可以定时执行的线程池

package com.leeue;
 
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
/**
 * 
 * @classDesc: 功能描述:(创建 可定时的线程池)
 */
public class NewScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newScheduledThreadPool.schedule(new Runnable() {
 
                @Override
                public void run() {
                    System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
 
                }
            }, 3, TimeUnit.SECONDS);//定时3秒后 执行这个线程池
        }
    }
}

è¿éåå¾çæè¿°

4、newSingleThreadExecutor:单线程池

package com.leeue;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 
 * @classDesc: 功能描述:(单线程的线程池)
 */
public class NewSingleThreadScheduledDemo {
    public static void main(String[] args) {
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newSingleThreadExecutor.execute(new Runnable() {
 
                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}

è¿éåå¾çæè¿°

5、停掉线程池的方法newSingleThreadExecutor.shutdown();//停掉线程池的方法

调用shoutdown()方法。

 

 

五、线程池原理分析

主要谈:核心线程池、最大线程数

核心线程满了,接下来进队列,队列也满了,创建新线程,直到达到最大线程数,之后再超出,会进入拒绝rejectedExecution