顺序打印-进阶版
方法一:三个线程竞争同一个锁,通过count判断是否打印
方法二:三个线程同时start,分别上锁,从a开始,打印后唤醒b
三个线程分别打印A,B,C
方法一:通过count计数打印(三个线程上同样的锁,打印一个,召唤所有锁,如果不满足条件,则wait等待,锁自动解锁)
方法二:
/**
* 有三个线程,分别只能打印A,B和C
* 要求按顺序打印ABC,打印10次
* 输出示例:
* ABC
* ABC
* ABC
* ABC
* ABC
* ABC
* ABC
* ABC
* ABC
* ABC
*/
public class Thread_ {
// 计数器
private static volatile int COUNTER = 0;
// 定义一个单独的锁对象
private static Object lock = new Object();
public static void main(String[] args) {
// 创建三个线程,并指定线程名,每个线程名分别用A,B,C表示
Thread t1 = new Thread(() -> {
// 循环10次
for (int i = 0; i < 10; i++) {
// 执行的代码加锁
synchronized (lock) {
// 每次唤醒后都重新判断是否满足条件// 每条线程判断的条件不一样,注意线程t1,t2
while (COUNTER % 3 != 0) {
try {
// 不满足输出条件时,主动等待并释放锁
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 满足输出条件,打印线程名,每条线程打印的内容不同
System.out.print(Thread.currentThread().getName());
// 累加计数
COUNTER++;
// 唤醒其他线程
lock.notifyAll();
}
}
}, "A");
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
synchronized (lock) {
while (COUNTER % 3 != 1) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(Thread.currentThread().getName());
COUNTER++;
lock.notifyAll();
}
}
}, "B");
Thread t3 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
synchronized (lock) {
while (COUNTER % 3 != 2) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 换行打印
System.out.println(Thread.currentThread().getName());
COUNTER++;
lock.notifyAll();
}
}
}, "C");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
public class Demo {
private static Object locker1 = new Object();
private static Object locker2 = new Object();
private static Object locker3 = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
synchronized (locker1) {
locker1.wait();
}
System.out.print("A");
synchronized (locker2) {
locker2.notify();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
synchronized (locker2) {
locker2.wait();
}
System.out.print("B");
synchronized (locker3) {
locker3.notify();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread t3 = new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
synchronized (locker3) {
locker3.wait();
}
System.out.println("C");
synchronized (locker1) {
locker1.notify();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
t2.start();
t3.start();
Thread.sleep(1000);
// 从线程 t1 启动
synchronized (locker1) {
locker1.notify();
}
}
}