Java并发-LockSupport线程阻塞工具类
如果要让线程阻塞,我们在讲线程基础的时候已经分析过了。如果要让线程暂停呢,不是blocked,而是waiting,这时候有什么办法?
Thread
类有一个弃用的方法suspend()
是线程暂停的意思,他被弃用的原因是线程挂起的时候并不会释放持有的锁资源,而且suspend()
挂起的线程状态依然是runnable,这也是不合理的。
那么有没有一种简单的方式可以使线程暂停呢?今天讲的LockSupport
就是专门来做这个的。
先来看代码:
public class LockSupportDemo {
static LsThread t1 = new LsThread("t1");
static LsThread t2 = new LsThread("t2");
public static void main(String[] args) throws InterruptedException {
t1.start();
Thread.sleep(1000);
t2.start();
LockSupport.unpark(t1);
LockSupport.unpark(t2);
t1.join();
t2.join();
}
}
class LsThread extends Thread{
public LsThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println("in "+getName());
LockSupport.park(this);
System.out.println("out " +getName());
}
}
LockSupport
使用起来非常简单,主要就是park()
和unpark()
方法。
当调用LockSupport.park
时,表示当前线程将会等待,直至获得许可,当调用LockSupport.unpark
时,必须把等待获得许可的线程作为参数进行传递,好让此线程继续运行。
使用LockSupport
可以解决suspend()
方法的弊端。
编辑 (opens new window)
上次更新: 2023/06/14