tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
一、基本介绍
park和unpark是Java中的两个线程同步工具,用于线程的阻塞和唤醒操作。
park方法是线程阻塞的方法,可以使当前线程进入等待状态,直到被其他线程唤醒。park方法有多个重载方法,其中最常用的是park()方法,该方法会使当前线程进入等待状态,直到被其他线程使用unpark方法唤醒。park方法还可以传入一个Object类型的参数,用于标识当前线程等待的条件,当该条件满足时,线程会被唤醒。
unpark方法是线程唤醒的方法,可以唤醒指定的线程。unpark方法也有多个重载方法,其中最常用的是unpark(Thread thread)方法,该方法可以唤醒指定的线程。如果该线程之前调用了park方法进入等待状态,那么它会被唤醒;如果该线程还没有调用park方法,那么它在调用park方法之后会立即返回。
park和unpark方法常用于实现线程的等待和唤醒操作,可以用于各种线程同步场景。需要注意的是,park和unpark方法应该谨慎使用,避免出现死锁等问题。
二、使用例子
package com.pany.camp.lock;
import java.util.concurrent.locks.LockSupport;
public class ParkDemo {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
System.out.println("Thread 1 is waiting...");
LockSupport.park(); // 线程1等待
System.out.println("Thread 1 is awakened.");
});
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 is waiting...");
LockSupport.park(); // 线程2等待
System.out.println("Thread 2 is awakened.");
});
thread1.start();
thread2.start();
try {
System.out.println("wait 2 s.");
Thread.sleep(2000); // 等待2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread1); // 唤醒线程1
LockSupport.unpark(thread2); // 唤醒线程2
}
}
在上面的代码中,我们创建了两个线程thread1和thread2,它们都调用了LockSupport.park()方法进入等待状态。然后我们等待了2秒钟,之后分别调用了LockSupport.unpark()方法唤醒线程1和线程2。当线程被唤醒时,它们会继续执行后面的代码。
三、使用注意事项
使用park和unpark方法需要注意以下几点:
park和unpark方法应该配对使用,否则可能会出现死锁等问题,因此在使用时应该确保调用unpark方法的次数不超过调用park方法的次数。
park方法可能会在没有调用unpark方法的情况下一直阻塞线程,因此在使用时应该确保线程有被唤醒的机会。
park和unpark方法可以用于线程的等待和唤醒操作,但是在某些情况下可能不是最优的选择,因此在使用时应该根据具体情况选择合适的线程同步机制。
park和unpark方法是比较底层的线程同步工具,使用时需要注意线程安全和可读性等问题,避免出现潜在的问题。
总之,使用park和unpark方法需要谨慎,遵循最佳实践,才能保证线程同步的正确性和高效性。