多线程之间按顺序调用,实现A->B->C,要求AA打印5次,BB打印10次,CC打印15此。循环10次。
代码:
public class ConditionDemo { public static void main(String[] args) { PrintStr printStr = new PrintStr(); new Thread(()->{ for (int i = 1; i <=10 ; i++) { printStr.print5(); } },String.valueOf("t1")).start(); new Thread(()->{ for (int i = 1; i <=10 ; i++) { printStr.print10(); } },String.valueOf("t2")).start(); new Thread(()->{ for (int i = 1; i <=10 ; i++) { printStr.print15(); } },String.valueOf("t3")).start(); } } class PrintStr{ private int number=1; 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 = 1; i <=5 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); }
//操作 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 = 1; i <=10 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); } 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 = 1; i <=15 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); } number=1; condition1.signal(); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } }
结果:

posted on
浙公网安备 33010602011771号