目录
六种状态
状态名称 | 说明 |
---|---|
NEW | 初始状态,被创建,但未调用start |
RUNABLE | 就绪状态 |
RUNING | 运行状态 |
BLOCKED | 阻塞状态,表示线程阻塞于锁 |
WAITING | 等待状态,需要等待其他线程做出特定的动作(通知或中断) |
TIME_WAITING | 超时等待状态,可以在指定时间内自动返回 |
TERMINATED | 终止状态 |
阻塞与等待的区别
- 阻塞:当一个线程试图获取对象锁(非java.util.concurrent库中的锁,即synchronized),而该锁被其他线程持有,则该线程进入阻塞状态。它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要由另一个线程来显式唤醒自己,不响应中断。
- 等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。它的特点是需要等待另一个线程显式地唤醒自己,实现灵活,语义更丰富,可响应中断。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。
需要强调的是虽然synchronized和JUC里的Lock都实现锁的功能,但线程进入的状态是不一样的。synchronized会让线程进入阻塞态,而JUC里的Lock是用LockSupport.park()/unpark()来实现阻塞/唤醒的,会让线程进入等待态。但话又说回来,虽然等锁时进入的状态不一样,但被唤醒后又都进入runnable态,从行为效果来看又是一样的
线程创建
无返回值
- 实现Runnable接口
Thread thread = new Thread(new Runnable(){ public void run(){ } });
- 继承Thread类
Thread thread = new Thread(){ public void run(){ } };
有返回值
- 实现Callable 接口,只有一个call方法
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() {
System.out.println(Thread.currentThread().getName() + " call()方法执行中...");
return 1;
}
}
Future
- Callable用于产生结果,Future 用于获取结果
Callable+Future获取多线程的执行结果。
- 利用线程池
使用Callable+FutureTask获取多线程的执行结果
sleep和wait
- Thread静态方法、
- 不释放锁、释放锁
- wait只能在同步方法或同步块中使用
线程中断机制
- 线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一个中断信号,如果目标线程没有接收线程中断的信号并结束线程,线程则不会终止,具体是否退出或者执行其他逻辑由目标线程决定。
1、java.lang.Thread#interrupt
中断目标线程,给目标线程发一个中断信号,线程被打上中断标记。
2、java.lang.Thread#isInterrupted()
判断目标线程是否被中断,不会清除中断标记。
3、java.lang.Thread#interrupted
判断目标线程是否被中断,会清除中断标记。