<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E5%85%B3%E4%BA%8E%E2%80%9CLockSupport.park%E2%80%9D</id>
	<title>关于“LockSupport.park” - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E5%85%B3%E4%BA%8E%E2%80%9CLockSupport.park%E2%80%9D"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E5%85%B3%E4%BA%8E%E2%80%9CLockSupport.park%E2%80%9D&amp;action=history"/>
	<updated>2026-05-15T18:47:04Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E5%85%B3%E4%BA%8E%E2%80%9CLockSupport.park%E2%80%9D&amp;diff=6258&amp;oldid=prev</id>
		<title>Eijux：​创建页面，内容为“category:Java  == 关于 ==  &lt;big&gt;'''LockSupport (Java Platform SE 8 )：'''&lt;/big&gt;&lt;ref&gt;参考：[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/LockSupport.html '''LockSupport (Java Platform SE 8 )''']&lt;/ref&gt;      '''These methods are designed to be used as tools for creating higher-level synchronization utilities, and are not in themselves useful for most concurrency control applications.'''      '''这些方法被设计为用于创建…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E5%85%B3%E4%BA%8E%E2%80%9CLockSupport.park%E2%80%9D&amp;diff=6258&amp;oldid=prev"/>
		<updated>2022-11-30T01:45:12Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:Java&quot; title=&quot;分类:Java&quot;&gt;category:Java&lt;/a&gt;  == 关于 ==  &amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;LockSupport (Java Platform SE 8 )：&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;&amp;lt;ref&amp;gt;参考：[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/LockSupport.html &amp;#039;&amp;#039;&amp;#039;LockSupport (Java Platform SE 8 )&amp;#039;&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;      &amp;#039;&amp;#039;&amp;#039;These methods are designed to be used as tools for creating higher-level synchronization utilities, and are not in themselves useful for most concurrency control applications.&amp;#039;&amp;#039;&amp;#039;      &amp;#039;&amp;#039;&amp;#039;这些方法被设计为用于创建…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Java]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
 &amp;lt;big&amp;gt;'''LockSupport (Java Platform SE 8 )：'''&amp;lt;/big&amp;gt;&amp;lt;ref&amp;gt;参考：[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/LockSupport.html '''LockSupport (Java Platform SE 8 )''']&amp;lt;/ref&amp;gt;&lt;br /&gt;
     '''These methods are designed to be used as tools for creating higher-level synchronization utilities, and are not in themselves useful for most concurrency control applications.'''&lt;br /&gt;
     '''这些方法被设计为用于创建更高级别的同步实用程序的工具，而这些方法本身对大多数并发控制应用程序并不有用。'''&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 '''LockSupport''' 是一个线程阻塞工具类，所有的方法都是静态方法，可以让线程在任意位置阻塞（当然阻塞之后肯定得有唤醒的方法）。&lt;br /&gt;
&lt;br /&gt;
== 用法 ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: blue; font-size:120%&amp;quot;&amp;gt;'''LockSupport.park()'''&amp;lt;/span&amp;gt; 和 &amp;lt;span style=&amp;quot;color: blue; font-size:120%&amp;quot;&amp;gt;'''LockSupport.unpark()'''&amp;lt;/span&amp;gt; 配合使用，用于“'''休眠/唤醒当前线程'''”。&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: blue; font-size:150%&amp;quot;&amp;gt;'''park'''&amp;lt;/span&amp;gt;&lt;br /&gt;
 public static void park()&lt;br /&gt;
 &lt;br /&gt;
     '''为了线程调度，禁用当前线程，除非许可（permit）可用'''。&lt;br /&gt;
 &lt;br /&gt;
     如果许可可用，则使用该许可，并且该调用立即返回；否则，为线程调度禁用当前线程，并在发生以下三种情况之一以前，使其处于休眠状态：&lt;br /&gt;
         1、其他某个线程将当前线程作为目标调用 '''unpark'''；&lt;br /&gt;
         2、其他某个线程'''中断'''当前线程；&lt;br /&gt;
         3、该调用不合逻辑地（即毫无理由地）返回。&lt;br /&gt;
 &lt;br /&gt;
     此方法并不报告是哪个线程导致该方法返回。调用者应该重新检查最先导致线程暂停的条件。调用者还可以确定线程返回时的中断状态。&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color: blue; font-size:150%&amp;quot;&amp;gt;'''unpark'''&amp;lt;/span&amp;gt;&lt;br /&gt;
 public static void unpark(Thread thread)&lt;br /&gt;
 &lt;br /&gt;
     如果给定线程的许可尚不可用，则使其可用。如果线程在上受阻塞，则它将解除其阻塞状态。否则，保证下一次调用不会受阻塞。如果给定线程尚未启动，则无法保证此操作有任何效果。&lt;br /&gt;
 &lt;br /&gt;
     参数：&lt;br /&gt;
         thread 一要执行 unpark 操作的线程；该参数为表示此操作没有任何效果。&lt;br /&gt;
: 示例&amp;lt;ref name=&amp;quot;example&amp;quot;&amp;gt;参考：[https://blog.csdn.net/liujianyangbj/article/details/117919108 '''CSDN'''：Java中的线程休眠大法系列（三）LockSupport.park()]&amp;lt;/ref&amp;gt;：&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; highlight=&amp;quot;8,16&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.concurrent.locks.LockSupport;&lt;br /&gt;
&lt;br /&gt;
public class LockSupportTest2 {&lt;br /&gt;
    public static void main(String[] args) throws InterruptedException {&lt;br /&gt;
        Thread t1 = new Thread(()-&amp;gt;{&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 开始执行&amp;quot;);&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 park()  &amp;quot;);&lt;br /&gt;
            LockSupport.park();&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 继续执行&amp;quot;);&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 当前的 Interrupt 状态：&amp;quot;+Thread.currentThread().isInterrupted());&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        t1.start();&lt;br /&gt;
        Thread.sleep(1000L);&lt;br /&gt;
        // unpark t1线程&lt;br /&gt;
        LockSupport.unpark(t1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
tl 线程 开始执行&lt;br /&gt;
tl 线程 park()&lt;br /&gt;
tl 线程 继续执行&lt;br /&gt;
tl 线程 当前的 Interrupt 状态：false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: blue; font-size:120%&amp;quot;&amp;gt;'''LockSupport.park(Object blocker)'''&amp;lt;/span&amp;gt; 和 &amp;lt;span style=&amp;quot;color: blue; font-size:120%&amp;quot;&amp;gt;'''LockSupport.getBlocker(Thread thread)'''&amp;lt;/span&amp;gt; 配合使用，可以进行自定义数据传输。&lt;br /&gt;
* blocker 为线程 thread 中定义的需要传输的数据类型。&lt;br /&gt;
: 示例&amp;lt;ref name=&amp;quot;example&amp;quot;/&amp;gt;：&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; highlight=&amp;quot;12,18&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
import java.util.concurrent.locks.LockSupport;&lt;br /&gt;
&lt;br /&gt;
public class LockSupportTest {&lt;br /&gt;
    public static void main(String[] args) throws InterruptedException {&lt;br /&gt;
        Thread t1 = new Thread(()-&amp;gt;{&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 开始执行&amp;quot;);&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 parkNanos()  &amp;quot;);&lt;br /&gt;
            HashMap blocker = new HashMap();&lt;br /&gt;
            blocker.put(&amp;quot;reason&amp;quot;,&amp;quot;测试LockSupport的park的blocker&amp;quot;);&lt;br /&gt;
            blocker.put(&amp;quot;code&amp;quot;,&amp;quot;1000&amp;quot;);&lt;br /&gt;
            LockSupport.parkNanos(blocker, 2000*1000*2000L);&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 继续执行&amp;quot;);&lt;br /&gt;
            System.out.println(&amp;quot;t1 线程 当前的 Interrupt 状态：&amp;quot; + Thread.currentThread().isInterrupted());&lt;br /&gt;
        });&lt;br /&gt;
        t1.start();&lt;br /&gt;
        Thread.sleep(1000L);&lt;br /&gt;
        Object blocker = LockSupport.getBlocker(t1);&lt;br /&gt;
        System.out.println(&amp;quot;t1 线程 的 blocker：&amp;quot; + blocker);&lt;br /&gt;
        Thread.sleep(1000*100L);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
: &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
tl 线程 开始执行&lt;br /&gt;
tl 线程 parkNanos()&lt;br /&gt;
tl 线程 的 blocker： {reason=测试LockSupport的park的blocker, code=1000}&lt;br /&gt;
tl 线程 继续执行&lt;br /&gt;
tl 线程当前的 Interrupt 状态：false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 区别 ==&lt;br /&gt;
LockSupport.park 与 Thread.sleep、Object.wait 语义类似，但有如下区别：&lt;br /&gt;
# LockSupport.park 方法会进入 '''WAITING''' 状态，而 LockSupport.parkNanos 会进入 '''TIMED_WAITING''' 状态。&lt;br /&gt;
#: 【Thread.sleep 进入 TIMED_WAITING 状态；   Object.wait 进入 WAITING 或 TIMED_WAITING 状态】&lt;br /&gt;
# LockSupport.park 不依赖 monitor 锁（与 synchronized 无关），所以'''不涉及锁的释放与否'''。&lt;br /&gt;
#: 【Thread.sleep 也不涉及锁的释放；   但 Object.wait 将会释放锁】&lt;br /&gt;
# LockSupport.park '''不会抛出受检查异常，不会吞掉 interrupt 标志位'''。&lt;br /&gt;
#: 【Thread.sleep 与 Object.wait 线程被打断的时候会抛出异常，而且 catch 代码块中得到的 interrupt 状态永远是 false】&lt;br /&gt;
#* 可以通过 Interrupt 的状态来“判断线程是不是被 interrupt 的（“中断标识”为“true”），还是被 unpark 或者到达指定休眠时间（“中断标识”为“false”）”。&lt;br /&gt;
# LockSupport.park 和 LockSupport.unpark 的使用'''不会出现死锁'''的情况。&lt;br /&gt;
&lt;br /&gt;
== 参考 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>