作用
挂起和释放线程
与suspend和resume的对比
– 线程挂起时的状态不同
package com.wenbin.locksipport;
import org.omg.PortableServer.THREAD_POLICY_ID;
import java.util.concurrent.locks.LockSupport;
public class Demo {
public static void main(String[] args) {
Thread supportThread = new Thread(() -> {
System.out.println("park线程执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 挂起线程
LockSupport.park();
System.out.println("park线程继续执行");
}, "locksupport-park");
Thread suspendThread = new Thread(() -> {
System.out.println("suspend线程执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 挂起线程
Thread.currentThread().suspend();
System.out.println("suspend线程继续执行");
}, "Thread-suspend");
supportThread.start();
suspendThread.start();
/*LockSupport.unpark(supportThread);
suspendThread.resume();*/
}
}
运行上面代码后,两个线程被挂起,通过jstack查看线程状态如下
两个线程都是被挂起,但是用suspend方法挂起的线程是RUNNABLE状态
– 释放线程
package com.wenbin.locksipport;
import org.omg.PortableServer.THREAD_POLICY_ID;
import java.util.concurrent.locks.LockSupport;
public class Demo {
public static void main(String[] args) {
Thread supportThread = new Thread(() -> {
System.out.println("park线程执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.park();
System.out.println("park线程继续执行");
}, "locksupport-park");
Thread suspendThread = new Thread(() -> {
System.out.println("suspend线程执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.currentThread().suspend();
System.out.println("suspend线程继续执行");
}, "Thread-suspend");
supportThread.start();
suspendThread.start();
LockSupport.unpark(supportThread);
suspendThread.resume();
}
}
控制台的信息如下,因为使用suspend挂起的线程,释放方法先执行了,所以线程一直处于挂起状态,而LockSupport解决了这个问题。
结论
结合两个比较的结果,就能知道为什么JDK把suspend和resume标记为不推荐使用,如果不小心没有释放线程,jstack查看的时候是运行态,想解决就只能通过读代码完成。
----------END------------