JUC Lock Condition实现精确通知唤醒
程序员文章站
2024-03-17 11:47:22
...
package juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PC {
public static void main(String[] args) {
Resource resource = new Resource();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource.printA();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource.printB();
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource.printC();
}
}, "C").start();
}
}
class Resource {
private int number = 1;
Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
/*
* 1.判断
* 2.业务
* 3.通知
* */
public void printA() {
lock.lock();
try {
while (number != 1) {
condition1.await();
}
number = 2;
System.out.println("当前线程的名字"+Thread.currentThread().getName());
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB() {
lock.lock();
try {
while (number != 2) {
condition2.await();
}
number = 3;
System.out.println("当前线程的名字"+Thread.currentThread().getName());
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC() {
lock.lock();
try {
while (number != 3) {
condition3.await();
}
number = 1;
System.out.println("当前线程的名字"+Thread.currentThread().getName());
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
当前线程的名字A
当前线程的名字B
当前线程的名字C
上一篇: 判断子网掩码是否合法-Java
下一篇: C/C++的文件读写