本文共 2542 字,大约阅读时间需要 8 分钟。
多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:
AA打印5次,BB打印10次,CC打印15次 接着AA打印5次,BB打印10次,CC打印15次
- 高聚低合前提下,线程操作资源类
- 判断/干活/通知
- 多线程交互中,必须防止多线程的虚假唤醒,也即(判断只能用while,不能用if)
- 标志位
//三个操作方法的版本import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class ShareResource{ private int number = 1; //1:A, 2:B, 3:C private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void print5(){ lock.lock(); try{ while(number!=1){ condition1.await(); } for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName()+"\tA"); } number = 2; condition2.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void print10(){ lock.lock(); try{ while(number!=2){ condition2.await(); } for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"\tB"); } number = 3; condition3.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void print15(){ lock.lock(); try{ while(number!=3){ condition3.await(); } for (int i = 0; i < 15; i++) { System.out.println(Thread.currentThread().getName()+"\tC"); } number = 1; condition1.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } }}public class ThreadOrderAccess { public static void main(String[] args) { ShareResource shareResource = new ShareResource(); new Thread(()->{ for (int i = 0; i < 10; i++) { shareResource.print5(); } },"thread1").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { shareResource.print10(); } },"thread2").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { shareResource.print15(); } },"thread3").start(); }}
转载地址:http://ajco.baihongyu.com/