线程的状态
名称 | 说明 |
---|---|
NEW | 初始状态,线程被构建,但还没有调用start()方法 |
RUNNABLE | 运行状态,java线程将操作系统中的就绪和运行统称为运行中 |
BLOCKED | 阻塞状态,表示线程阻塞于锁 |
WAITING | 等待状态,当前线程需要等待其他线程做出一些特定动作(通知或中断) |
TIME_WAITING | 超时等待状态,不同于WAITING,它可以在指定的时间自行返回的 |
TERMINATED | 终止状态 |
Daemon线程
线程默认不是daemon线程,需要setDaemon(true)。daemon线程的finally方法,不一定有机会执行。
启动和终止
suspend()、resume()和stop()
suspend方法在调用后,线程不会释放已经占有的资源,而是占用资源进入睡眠状态。
同样,stop方法在中介一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会。
进程间通信
volatile和synchronized的方式
通过共享变量的方式
等待/通知机制
wait/notify(notifyAll)
指线程A调用了对象O的wait方法进入等待状态,而线程B通过调用对象O的notify或者notifyAll方法来唤醒A线程,A线程从wait方法返回继续执行。
- 调用waie、notify、notifyAll方法时,需要先对调用对象加锁
- 调用wait后,释放锁。线程状态由running变为waiting
- notify、notifyAll释放所之后,wait的线程才能获取锁。
- 调用notify、notifyAll后,等待线程从等待队列中移到同步队列中,被移动的线程的状态由WATING变为BLOCKED
使用方式:
- Thread.join
- 线程池
- 数据库连接池
LockSupport
- Condition(await、signal、signalAll)
- AbstractQueuedSynchronizer
- ReentrantLock
- CountDownLatch
- …
ThreadLocal
线程应用实例
等待超时模式
1 | long future = System.currentTimeMillis() + mills; |
线程池
1 | package com.iforfee.common.thread; |