 多线程进阶-park和unpark
多线程进阶-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
 
 
