Condition具有 精准的通知和唤醒线程的功能,Condition是个接口,基本的方法就是await()和signal()方法;Condition依赖于Lock接口
Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()。
------------------------------------------------------------------------------------------
LockSupport 很类似于二元信号量(只有1个许可证可供使用),如果这个许可还没有被占用,当前线程获取许可并继 续 执行;如果许可已经被占用,当前线 程阻塞,等待获取许可。
上代码:
package JUC;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Description:
* @Author CHEN
* @Date 2022/5/4 0004
*/
public class sync {
// static final Object lockA = new Object();
public static void ConditionTest() {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
new Thread(() -> {
lock.lock();
try {
System.out.println("1");
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("3");
} finally {
lock.unlock();
}
}, "ConditionTest").start();
new Thread(() -> {
lock.lock();
try {
System.out.println("2");
condition.signal();
} finally {
lock.unlock();
}
}).start();
}
public static void LockSupportTest() {
Thread thread1 = new Thread(() -> {
System.out.println("1");
LockSupport.park();
System.out.println("2");
});
thread1.start();
Thread thread2 = new Thread(() -> {
System.out.println("3");
LockSupport.unpark(thread1);
}
);
thread2.start();
}
public static void main(String[] args) {
ConditionTest();
System.out.println("------------------------------");
LockSupportTest();
}
}
运行结果为:
ConditionTest结果:
1
2
3
Process finished with exit code 0
----------------------------------------------------
LockSupportTest结果:
1
3
2
Process finished with exit code 0