LockSupport线程阻塞的运用

LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。

接下面我来看看LockSupport有哪些常用的方法。主要有两类方法:parkunpark

为什么叫park呢,park英文意思为停车。我们如果把Thread看成一辆车的话,park就是让车停下,unpark就是让车启动然后跑起来。

以下代码,运用LockSupport  将"abcdefg" 与 "1234567" 间隔打印出来:

package cn.dinner.study;

import java.util.concurrent.locks.LockSupport;

public class LockSupportTest {

	static Thread t1 = null,t2 = null;
	
	public static void main(String[] args) {
		char [] aa = "abcdefg".toCharArray(); 
		char [] mm = "1234567".toCharArray(); 
		
		t1 = new Thread(() -> {
			for(char a:aa){
				System.out.println(a);
				LockSupport.unpark(t2);
				LockSupport.park();
			}
		});
		
		t2 = new Thread(() -> {
			for(char m:mm){
				LockSupport.park();
				System.out.println(m);
				LockSupport.unpark(t1);
			}
		});
		
		t1.start();
		t2.start();
	}
}

以下是jdk的官方文档:

另:

  1. park和unpark可以实现类似wait和notify的功能,但是并不和wait和notify交叉,也就是说unpark不会对wait起作用,notify也不会对park起作用。
  2. park和unpark的使用不会出现死锁的情况
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 中有多种方式可以使线程阻塞,常见的有以下几种: 1. 调用 sleep 方法:调用 Thread 类的 sleep(long millis) 方法可以使当前线程阻塞指定的时间(毫秒),在此期间线程不会释放锁,但是不会占用 CPU 资源,适合在等待一段时间后再继续执行的场景。 2. 调用 wait 方法:调用 Object 类的 wait() 方法可以使当前线程等待,直到其它线程调用该对象的 notify() 或 notifyAll() 方法唤醒该线程,wait() 方法会释放对象锁,进入等待状态,等待其它线程通知。通常 wait() 方法需要和 synchronized 关键字一起使用,确保线程安全。 3. 调用 join 方法:调用 Thread 类的 join() 方法可以使当前线程等待另一个线程执行完毕后再继续执行,join() 方法会阻塞当前线程,等待目标线程执行完毕,然后当前线程才会继续执行。 4. 调用 LockSupport.park 方法:调用 LockSupport 类的 park() 方法可以使当前线程阻塞,直到另一个线程调用该线程的 unpark() 方法唤醒该线程。park() 方法可以用于实现线程间的同步和控制,例如等待某个条件满足后再继续执行。 需要注意的是,线程阻塞和线程挂起是不同的概念。线程阻塞是指线程在等待某个事件发生时被暂停执行,但是线程仍然处于存活状态,可以被唤醒继续执行。线程挂起是指线程被完全暂停,不再占用 CPU 资源,只有接收到特定的信号才能被唤醒。在 Java 中,线程阻塞的方式通常是使用上述几种方法,线程挂起通常是使用操作系统提供的机制,例如 POSIX 中的 sigsuspend() 函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值