java并发:LockSupport

版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/83149142

一个好用的东西.阻塞和释放线程用的.

先看代码:

 public static void aaa() {
		 System.out.println("阻塞开始");
		 LockSupport.park();
		 System.out.println("111");
 }

park()就是执行线程一直阻塞,111根本不会执行.

再看这个代码:

 public static void aaa() {
		 System.out.println("阻塞开始");
		 LockSupport.unpark(Thread.currentThread());
		 LockSupport.park();
		 System.out.println("111");
	 }

这个111是会执行的.

原理:

LockSupport和关联的每一个线程都有一个许可permit.这个许可permit只有0 和1 两个值.默认是0.

unpark ---> permit =1;
park  ----> if (permit == 0){
                阻塞
            } 
            if (permit  ==1){
                permit = 0;
            }

也就是说,

1.无论如何unpark会将permit设置为1.

2.如果permit = 0,线程阻塞.

3.如果permit =1 ,park会将permit = 0

看看下面这个发令枪的小案例吧.和countDownLatch有些类似.

public static void aaa() throws InterruptedException {
		Thread t = new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.println("ready!!!");
				LockSupport.park();//阻塞
				System.out.println("go!!!!");
			}
		});
		t.start();// 启动时阻塞

		// 3秒后执行发放通行证
		Thread.sleep(3000);
		LockSupport.unpark(t);
	}

处于park状态的线程怎么离开park状态?javadoc如是说:

1.被unpark

2.被interrupts

3.虚假返回??

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/83149142