需要使用lock的Condition接口来实现三个线程顺序打印
* Lock * condition.await(); * condition.signal(); * condition.signalAll(); * 和wait(), notify(), notifyALl() 功能差不多 * 区别 notify唤醒 * signal唤醒某一把锁 * */ class ShareData{ //为何用Lock Lock可以设置多把锁和多把钥匙 可以定向唤醒 Lockgood_demo private int number = 1;//a:1 b:2 c:3 //synchronized重锁1.8前 private Lock lock=new ReentrantLock();//ReentrantLock递归锁 非公平锁 新版的 private Condition c1=lock.newCondition();//多把钥匙 多吧锁 private Condition c2=lock.newCondition(); private Condition c3=lock.newCondition(); public void printc1() { lock.lock(); try{ while (number!=1){c1.await();}//if可能有虚假唤醒//1.判断 System.out.println(Thread.currentThread().getName()+"t执行");//2.干活 number=2;c2.signalAll(); //3.通知 }catch (Exception e){e.printStackTrace();}finally {lock.unlock();} } public void printc2() { lock.lock(); try{ while (number!=2){c2.await();}//if可能有虚假唤醒//1.判断 System.out.println(Thread.currentThread().getName()+"t执行");//2.干活 number=3;c3.signalAll();//3.通知 }catch (Exception e){e.printStackTrace();}finally {lock.unlock();} } public void printc3() { lock.lock(); try{ while (number!=3){c3.await();}//if可能有虚假唤醒//1.判断 System.out.println(Thread.currentThread().getName()+"t执行");//2.干活 number=1;c1.signalAll(); //3.通知 }catch (Exception e){e.printStackTrace();}finally {lock.unlock();} } } public static void main(String[] args) { Lockgood_demo(); } private static void Lockgood_demo() { ShareData shareData=new ShareData(); //顺序打印五遍A B C new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc1();},"A").start(); new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc2();},"B").start(); new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc3();},"C").start(); } //精确唤醒某些线程 private Condition c1=lock.newCondition();//多把钥匙 多把锁
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)