Java 由浅入深聊聊线程池及原理

线程池的优势

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了最
大数量,超出的数量的线程排队等候等其他线程执行完毕再从队列中取出任务来执行。

他的主要特点为:线程复用;控制最大并发数;管理线程。

第一:降低资源消耗。通过重复利用自己创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程和粗昂就爱你就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限的创阿金,不仅会消耗资源,还会较低系统的稳定性,使用线程池可以进行统一分配,调优和监控。

架构图

Java中的线程池是通过Executor框架实现的

Java 由浅入深聊聊线程池及原理_第1张图片

种类及使用

Java 线程池总共分为五种

1.newFixedThreadPool

创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待。在某个线程被显式地关闭之前,池中的线程将一直存在。

newFixedThreadPool 创建的线程池 corePoolSize 和 MaxmumPoolSize 是相等的,阻塞队列使用的的LinkedBlockingQueue

示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        try {
            for (int i = 1; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" invoked");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();//关闭线程池
        }
    }
}

结果

Java 由浅入深聊聊线程池及原理_第2张图片

2.newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行。

newSingleThreadExecutor 将corePoolSize 和MaxmumPoolSize 设置为1,阻塞队列使用的的LinkedBlockingQueue

示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        try {
            for (int i = 1; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" invoked");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();//关闭线程池
        }
    }
}

结果

Java 由浅入深聊聊线程池及原理_第3张图片

3.newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程。

newCachedThreadPool 将 corePoolSize 设置为 0,MaxmumPoolSize 设置为 Integer.MAX_VALUE,阻塞队列使用的是SynchronousQueue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程。

你可能感兴趣的:(Java,java)