多线程进阶-park和unpark
Table of Contents generated with DocToc (opens new window)
# 7、park和unpark
park和unpark是LockSupport类中的方法
//暂停当前线程 LockSupport.park(); //恢复某个线程 LockSupport.unpark(暂停线程对象);
1
2
3
4
5
先 park 再unpark
Thread thread = new Thread(() -> {
System.out.println("start.....");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("park....");
LockSupport.park();
System.out.println("resume.....");
});
thread.start();
Thread.sleep(2000);
System.out.println("unpark....");
LockSupport.unpark(thread);
//运行结果
start.....
park....
unpark....
resume.....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 注意:
- park 中的线程,处于 WAIT 状态
- unpark 既可以在 park 之前调用或之后调用,都是用来恢复某个线程的运行,简单的说,调用 unpark 后再调用 park 线程依然不会暂停,类似提前“解毒”。
# 特点
与Object的wait、notify相比
- wait、notify和notifyAll必须配合Object Monitor一起使用(即必须在有锁的情况下使用),而park/unpark不用
- park/unpark配对使用能够精确的指定具体的线程的阻塞/运行,而notify只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,不精确
- park/unpark可以先unpark,而wait/notify不能先notify
# 补充知识:线程的六种状态
- NEW:线程刚刚被创建时,还没有start()的状态
- RUNABLE: Java中的RUNABLE包含了操作系统层面的运行,阻塞,可运行状态。 操作系统层面的线程的运行,阻塞等在Java层面无法体现出来。 BLOCKED,WAITING,TIMED_WAITINGJava API层面的阻塞
- TIMED_WAITING:使用sleep方法可能会出现
- WAITING: 使用join,wait方法后可能会出现
- BLOCKED:使用synchronize方法可能会出现
- diey:线程运行结束
在 GitHub 上编辑此页 (opens new window)
最后更新: 2022/10/04, 16:10:00