一、java线程的6种状态
1.初始状态(NEW)
线程被创建,但是还没有运行start方法
2.运行状态(RUNNABLE)
JAVA线程将操作系统中的就绪和运行两种状态统一称为运行中
3.阻塞状态(BLOCKED)
4.等待状态(WAITING)
等待状态,没有时间限制,要被其他线程唤醒或者有其他的唤醒操作
执行wait、join
5.超时等待(TIME_WAITING)
有等待时间,超时自动返回
执行sleep,带参数的wait
6.终止(TEMINATED)
代表线程执行完毕
二、sleep()、wait()、join()的区别
1.sleep()方法需要指定等待的时间,不会释放锁标志,是Thread的静态方法
2.wait()方法,和notify()及notifyAll()一起协调对共享数据的存取,都是Object类的方法,wait()方法会释放锁标志
3.join(),主线程等待子线程的终止,如果主线程需要知道子线程的执行结果时,可以使用该方法
三、创建线程的三种方式
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
四、线程池的参数
1.corePoolSize(核心线程数):线程池中始终保持的活动线程数量。即使这些线程处于空闲状态,也不会被回收,除非线程池被关闭。必传
2.maximumPoolSize(最大线程数):线程池允许的最大线程数量,包括核心线程和临时线程。当任务数量超过核心线程数并且工作队列已满时,线程池会创建新的临时线程,直到达到最大线程数。必传
3.keepAliveTime(线程空闲时间):非核心线程在空闲状态下被保留的最长时间。超过这个时间,多余的线程将被终止,以便减少资源消耗。不必传
4.unit(时间单位):用于定义keepAliveTime的时间单位,通常是TimeUnit.MILLISECONDS(毫秒)等。不必传
5.workQueue(工作队列):用于保存等待执行的任务的队列。可以是各种类型的队列,如LinkedBlockingQueue、ArrayBlockingQueue等。必传
6.threadFactory(线程工厂):用于创建新线程的工厂。你可以自定义线程工厂来控制线程的创建过程。必传
7.handler(拒绝策略):当工作队列已满且线程池中的线程数量达到最大值时,新提交的任务将被拒绝执行的策略。必传
常见的拒绝策略有ThreadPoolExecutor.AbortPolicy(默认,抛出异常)、ThreadPoolExecutor.CallerRunsPolicy(在提交任务的线程中直接执行任务)、ThreadPoolExecutor.DiscardPolicy(默默丢弃任务)、ThreadPoolExecutor.DiscardOldestPolicy(丢弃最旧的任务)。