线程交替打印

张开发
2026/4/15 14:19:17 15 分钟阅读

分享文章

线程交替打印
方法1park/unparkpackagecom.itheima.test;importstaticjava.util.concurrent.locks.LockSupport.park;importstaticjava.util.concurrent.locks.LockSupport.unpark;publicclassTest5{privatestaticThreadt1,t2,t3;publicstaticvoidmain(String[]args){ParkerparkernewParker(5);t1newThread(()-{parker.print(t2,a);},t1);t2newThread(()-{parker.print(t3,b);},t2);t3newThread(()-{parker.print(t1,c);},t3);t1.start();t2.start();t3.start();unpark(t1);}}classParker{privateintloopNumber;publicParker(intloopNumber){this.loopNumberloopNumber;}publicvoidprint(Threadt,Strings){for(inti0;iloopNumber;i){park();//更健壮还是要共享变量控制System.out.println(s);unpark(t);}unpark(t);}}方法二reentrantlock用state防止虚假唤醒也能防止信号丢失导致死锁packagecom.itheima.test;importorg.springframework.aop.ThrowsAdvice;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;importstaticjava.util.concurrent.locks.LockSupport.park;importstaticjava.util.concurrent.locks.LockSupport.unpark;publicclassTest4{privatestaticfinalReentrantLocklocknewReentrantLock();privatestaticConditionc1lock.newCondition();privatestaticConditionc2lock.newCondition();privatestaticConditionc3lock.newCondition();publicstaticvoidmain(String[]args)throwsInterruptedException{TasktasknewTask(5,lock,0);newThread(()-{task.print(a,c1,c2,0);}).start();newThread(()-{task.print(b,c2,c3,1);}).start();newThread(()-{task.print(c,c3,c1,2);}).start();}}classTask{privateintloopNumber;privateintstate;privateReentrantLocklock;publicvoidprint(Strings,Conditionnow,Conditionlast,intnowState){for(inti0;iloopNumber;i){lock.lock();try{while(state!nowState){try{now.await();}catch(InterruptedExceptione){thrownewRuntimeException(e);}}System.out.println(s);state(state1)%3;last.signal();}finally{lock.unlock();}}}publicTask(intloopNumber,ReentrantLocklock,intstate){this.loopNumberloopNumber;this.statestate;this.locklock;}}方法三sychronized配合条件变量使用packagecom.itheima.test;publicclassTest6{publicstaticvoidmain(String[]args){SynchronizedersynchronizedernewSynchronizeder(5);newThread(()-{synchronizeder.print(a,0);}).start();newThread(()-{synchronizeder.print(b,1);}).start();newThread(()-{synchronizeder.print(c,2);}).start();}}classSynchronizeder{privateintloopNumber;privateintstate;publicvoidprint(Strings,intnowState){for(inti0;iloopNumber;i){synchronized(this){while(state!nowState){try{this.wait();}catch(InterruptedExceptione){thrownewRuntimeException(e);}}System.out.println(s);state(state1)%3;this.notifyAll();}}}publicSynchronizeder(intloopNumber){this.loopNumberloopNumber;}}

更多文章