线程池的五种状态
running,shutdown,stop,Tiding,Terminated
- runing:
线程池处于运行状态,可以接受任务,执行任务,创建线程默认就是这个状态。 - showDown
调用showdown()函数,不会接受新任务,但是会慢慢处理完堆积的任务。 - Stop
调用showdownnow()函数,不会接受新任务,不处理已有任务,会中断现有任务。 - Tiding
当线程池状态为showdown或者stop,任务数量为0,就会变为tidying。这个时候会调用钩子函数terminated()。
- Terminated:
termiinated()执行完成
在线程池中,用了一个原子类来记录线程池的信息,用了int的高3位表示状态,后面的29位表示线程池中线程的个数。
线程的6种状态
- NEW 尚未启动的线程状态,即线程创建,还未调用start方法
- RUNNABLE 就绪状态(调用start,等待调度)+正在运行
- BLOCKED 等待监视器锁时,陷入阻塞状态
- WAITING 等待状态的线程正在等待另一线程执行特定的操作(如notify)
- TIMED_WAITING 具有指定等待时间的等待状态
- TERMINATED 线程完成执行,终止状态
1,状态转换原因:
"Waiting"状态是由线程自身主动进入的,例如调用了Object.wait()、Thread.join()或者LockSupport.park()等方法。
"Blocked"状态是由于线程试图获取某个对象的锁,但该锁已被其他线程占用,因此线程被阻塞。
2,等待对象:
"Waiting"状态的线程等待其他线程对特定对象的通知或完成特定操作,例如调用了Object.wait()方法等待被唤醒。
"Blocked"状态的线程等待其他线程释放某个对象的锁,以便自己获取锁并继续执行。
3,状态转换条件:
"Waiting"状态的线程可以通过其他线程的通知或者等待时间到期来解除等待状态。
"Blocked"状态的线程在获取锁的过程中,如果锁被其他线程释放,则可以转换为可运行状态。
4,状态影响:
"Waiting"状态的线程不参与调度,直到被唤醒或等待时间到期,才能重新参与调度。
"Blocked"状态的线程不参与调度,直到获取到所需的锁,才能重新参与调度。
wait是会释放cpu资源的