wait(),notify()等方法也依赖于monitor对象,因此wait(),notify()等方法只能在同步代码中使用。moniterenter和moniterexit。
lock.lock();
try {
// ...
}finally {
lock.unlock();
}
trylock(long timeout,TimeUnit unit);也可以不中断lock();一共3个线程,线程A打印数字1,线程2打印数字1,2,线程3打印数据1,2,3,轮询10次。
class Test {
private int num = 1; // num:1线程A干活 num:2线程B干活 num:3线程C干活
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
void print1() {
lock.lock();
try {
//1.判断
while (num != 1) {
condition1.await();
}
//2.干活
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + ",打印," + i);
}
//3.通知
num = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
void print2() {
lock.lock();
try {
//1.判断
while (num != 2) {
condition2.await();
}
//2.干活
for (int i = 1; i <= 2; i++) {
System.out.println(Thread.currentThread().getName() + ",打印," + i);
}
//3.通知
num = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
void print3() {
lock.lock();
try {
//1.判断
while (num != 3) {
condition3.await();
}
//2.干活
for (int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName() + ",打印," + i);
}
//3.通知
num = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
class Main {
public static void main(String[] args) {
Test test = new Test();
new Thread(() -> {
for (int i = 1; i <= 3; i++) {
test.print1();
}
}, "AA").start();
new Thread(() -> {
for (int i = 1; i <= 3; i++) {
test.print2();
}
}, "BB").start();
new Thread(() -> {
for (int i = 1; i <= 3; i++) {
test.print3();
}
}, "CC").start();
}
}


class Test {
private int num = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
void add() {
lock.lock();
try {
while (num != 0) {
condition.await(); //等待
}
num++;
System.out.println(Thread.currentThread().getName() + ",num" + num);
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
void sub() {
lock.lock();
try {
while (num == 0) {
condition.await(); //等待
}
num--;
System.out.println(Thread.currentThread().getName() + ",num" + num);
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
class Main {
public static void main(String[] args){
Test test = new Test();
new Thread(() -> {
for (int i = 1; i <= 5; i++) {
test.add();
}
}, "AA").start();
new Thread(() -> {
for (int i = 1; i <= 5; i++) {
test.sub();
}
}, "BB").start();
}
}
生产者消费者2.0这个文章更详细:https://blog.csdn.net/wd_888/article/details/105154184?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-105154184-blog-48290937.pc_relevant_multi_platform_whitelistv6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-105154184-blog-48290937.pc_relevant_multi_platform_whitelistv6&utm_relevant_index=5