展会网站怎么做,赣州企业网站建设推广,php做外贸网站好吗,大数据分析营销平台顺序打印-进阶版
方法一#xff1a;三个线程竞争同一个锁#xff0c;通过count判断是否打印
方法二#xff1a;三个线程同时start#xff0c;分别上锁#xff0c;从a开始#xff0c;打印后唤醒b 三个线程分别打印A#xff0c;B#xff0c;C 方法一#xff1a;通过co…顺序打印-进阶版
方法一三个线程竞争同一个锁通过count判断是否打印
方法二三个线程同时start分别上锁从a开始打印后唤醒b 三个线程分别打印ABC 方法一通过count计数打印三个线程上同样的锁打印一个召唤所有锁如果不满足条件则wait等待锁自动解锁 方法二
/*** 有三个线程分别只能打印AB和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,t2while (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();}}
}