循环打印三个线程,ABC 十次

xiaoxiao2021-02-27  252

public static class ThreadPrinter implements Runnable {           private String name;           private Object prev;           private Object self;               private ThreadPrinter(String name, Object prev, Object self) {               this.name = name;               this.prev = prev;               this.self = self;           }               @Override           public void run() {               int count = 3;   //打印次数             while (count > 0) {//多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒                   synchronized (prev) {    // 先获取 prev 锁                       synchronized (self) {// 再获取 self 锁                           System.out.print(name);                           count--;                               self.notifyAll();// 先释放 self,唤醒其他线程竞争self锁                       }                       try {                           prev.wait();     // 再释放 prev,休眠等待唤醒                           /**                           * 注意的是notify()调用后,并不是马上就释放对象锁,而是在相应的synchronized(){}语句块执行结束,自动释放锁,                           * JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。                           */                       } catch (InterruptedException e) {                           e.printStackTrace();                       }                   }               }           }       }           public static void main(String[] args) throws Exception {           Object a = new Object();           Object b = new Object();           Object c = new Object();           ThreadPrinter pa = new ThreadPrinter("A", c, a);           ThreadPrinter pb = new ThreadPrinter("B", a, b);           ThreadPrinter pc = new ThreadPrinter("C", b, c);                   new Thread(pa).start();        //   Thread.sleep(3);           new Thread(pb).start();         //  Thread.sleep(10);           new Thread(pc).start();       //    Thread.sleep(10);       }  
转载请注明原文地址: https://www.6miu.com/read-9851.html

最新回复(0)