LockSupport用法
2019-08-17 本文已影响2人
endlesswork
一、示例
1.park用法
LockSupport的用法
public class LockSupportDemo implements Runnable{
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LockSupportDemo(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name + "开始执行");
LockSupport.park();
System.out.println(name + "正常执行");
System.out.println(name + "阻塞状态" + Thread.interrupted());
}
public static void main(String args[]) throws InterruptedException {
LockSupportDemo lockSupportDemo = new LockSupportDemo("t1");
Thread thread1 = new Thread(lockSupportDemo);
thread1.start();
LockSupportDemo lockSupportDemo2 = new LockSupportDemo("t2");
Thread thread2 = new Thread(lockSupportDemo2);
thread2.start();
Thread.sleep(1000);
System.out.println("开始执行解锁");
LockSupport.unpark(thread2);
System.out.println("线程1的运行状态为"+thread1.getState());
}
}
结果如下
t1开始执行
t2开始执行
开始执行解锁
t2正常执行
t2阻塞状态false
线程1的运行状态为WAITING
2.对于park带参方法
这里我们看下park带参方法使用
public class LockSupportDemo1{
public static Test test = new Test("test1");
public static class ThreadDemo implements Runnable{
public ThreadDemo(String name){
this.name = name;
}
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
System.out.println(name + "开始执行" + dateFormat.format(date));
LockSupport.park(test);
Date date1 = new Date();
System.out.println(name + "正常执行" + dateFormat.format(date1));
System.out.println(name + "阻塞状态" + Thread.interrupted());
}
}
public static class ThreadDemo2 implements Runnable{
public ThreadDemo2(String name){
this.name = name;
}
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
synchronized (test){
Date date = new Date();
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
System.out.println("------------获取synchronized锁成功"+test.getTag()+ dateFormat.format(date));
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date date1 = new Date();
System.out.println("------------获取synchronized锁结束"+test.getTag()+ dateFormat.format(date1));
}
}
}
public static class Test{
public Test(String tag){
this.tag =tag;
}
public String tag;
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
public static void main(String args[]) throws InterruptedException {
ThreadDemo threadDemo = new ThreadDemo("t1");
Thread thread1 = new Thread(threadDemo);
thread1.start();
Thread.sleep(1000);
ThreadDemo2 threadDemo2 = new ThreadDemo2("t2");
Thread thread2 = new Thread(threadDemo2);
thread2.start();
Thread.sleep(1000);
LockSupport.unpark(thread1);
}
}
结果如下,可以看到线程t1并没有等待t2持有test的对象锁
t1开始执行2019-04-20 :03:28:53
------------获取synchronized锁成功test12019-04-20 :03:28:54
***********2019-04-20 :03:28:55
t1正常执行2019-04-20 :03:28:55
t1阻塞状态false
------------获取synchronized锁结束test12019-04-20 :03:28:59
3、unpark顺序分析
public class LockSupportDemo2 implements Runnable{
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LockSupportDemo2(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(name + "开始执行");
LockSupport.unpark(Thread.currentThread());
LockSupport.park();
System.out.println(name + "正常执行");
System.out.println(name + "阻塞状态" + Thread.interrupted());
}
public static void main(String args[]) throws InterruptedException {
LockSupportDemo2 lockSupportDemo = new LockSupportDemo2("t1");
Thread thread1 = new Thread(lockSupportDemo);
thread1.start();
Thread.sleep(1000);
System.out.println("开始执行解锁");
LockSupport.unpark(thread1);
}
}
可以看到结果,unpark会让下次park不起作用
t1开始执行
t1正常执行
t1阻塞状态false
开始执行解锁