1 什么是线程
线程(Thread)是计算机中的一条执行路径,它是进程中的一个实体,负责程序中的指令执行。在一个进程中可以包含多个线程,每个线程可以并行执行不同的任务,从而加快程序的运行速度。
线程独立于进程而存在,但是它们都处于操作系统所分配的资源上下文中。线程需要依赖于进程来获得运行资源,如内存、CPU 时间等。在多线程编程中,线程可以共享进程的资源,因此线程之间可以更加高效地完成任务。
使用线程可以提高程序的响应速度和并发性,特别是在多核 CPU 的环境下,可以充分利用 CPU 资源,提高程序的运行效率。但是多线程编程也存在一些问题,比如线程安全、死锁等,需要开发者注意和处理
2 什么是线程池
线程池(Thread Pool)是一种用于管理和调度线程的机制。它是在应用程序启动时创建一组预先初始化的线程,并将这些线程放入一个池中,供需要执行任务的代码使用。
线程池的主要目的是重用线程,避免频繁创建和销毁线程的开销,提高程序的性能和资源利用率。当有新的任务到达时,线程池从池中取出一个空闲的线程来执行任务,执行完毕后线程并不立即销毁,而是返回线程池等待下一次任务的到来。
3 线程池的作用
线程池主要有两个作用:
● 重复利用已经创建的线程,避免创建和销毁线程的开销;
● 控制并发线程的数量,避免过多的线程占用系统资源。
4 线程池的实现方式
Java 线程池可以通过 ThreadPoolExecutor 类来实现,该类提供了一系列的构造方法,可以根据不同的需求来创建线程池。常用的构造方法如下:
其中,参数解释如下:
● corePoolSize:核心线程数,即线程池中最少需要保持的线程数量;
● maximumPoolSize:最大线程数,即线程池中允许存在的最多线程数量;
● keepAliveTime:线程空闲时间,即当线程空闲时间超过该值,且当前线程数量超过 corePoolSize,则该线程会被销毁;
● unit:空闲时间的单位;
● workQueue:工作队列,用于存放等待执行的任务。
5线程池的工作流程
线程池的工作流程如下:
1) 当任务到来时,线程池会先判断当前线程池中的线程数量是否达到了 corePoolSize,如果没有,则创建一个新的线程执行该任务。
2) 如果当前线程池中的线程数量已经达到了 corePoolSize,则将任务加入到工作队列中等待执行。
3) 当工作队列已满时,线程池会继续创建新的线程执行任务,直到线程数量达到了 maximumPoolSize。
4) 如果线程数量已经达到了 maximumPoolSize,且工作队列已经满了,则线程池会根据设置的拒绝策略进行处理,一般情况下会抛出异常。
6 线程池的拒绝策略
ThreadPoolExecutor 类提供了四种拒绝策略:
1) AbortPolicy:默认策略,当任务无法被处理时,会抛出 RejectedExecutionException 异常;
2) CallerRunsPolicy:当任务无法被处理时,会在提交任务的线程上直接执行该任务;
3) DiscardOldestPolicy:当任务无法被处理时,会丢弃等待队列中最旧的任务,并尝试重新提交该任务;
4) DiscardPolicy:当任务无法被处理时,会直接丢弃该任务。
7线程池的使用注意事项
1) 线程池的参数需要根据具体业务场景进行调整,以充分利用系统资源;
2) 避免使用无界队列,因为当任务过多时,会导致内存溢出;
3) 在销毁线程池时,需要先调用 shutdown() 方法关闭线程池,然后再调用 awaitTermination() 方法等待所有任务执行完成,最后再调用 shutdownNow() 方法强制关闭线程池。
8 java创建线程的案例
Java 创建线程常见有两种方式
1) 继承自 Thread 类的 MyThread 类,案例如下
2) 实现Runnable接口,案例如下
9 java创建线程池的案例
以下是一个使用 Java 创建线程池的简单案例: