java实现两个线程交替打印的实例代码
使用ReentrantLock实现两个线程交替打印
实现字母在前数字在后
packagecom.study.pattern; importjava.util.concurrent.CountDownLatch; importjava.util.concurrent.locks.Condition; importjava.util.concurrent.locks.Lock; importjava.util.concurrent.locks.ReentrantLock; publicclassDemo2{ privatestaticLocklock=newReentrantLock(); privatestaticConditionc1=lock.newCondition(); privatestaticConditionc2=lock.newCondition(); privatestaticCountDownLatchcount=newCountDownLatch(1); publicstaticvoidmain(String[]args){ Stringc="ABCDEFGHI"; char[]ca=c.toCharArray(); Stringn="123456789"; char[]na=n.toCharArray(); Threadt1=newThread(()->{ try{ lock.lock(); count.countDown(); for(charcaa:ca){ c1.signal(); System.out.print(caa); c2.await(); } c1.signal(); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ lock.unlock(); } }); Threadt2=newThread(()->{ try{ count.await(); lock.lock(); for(charnaa:na){ c2.signal(); System.out.print(naa); c1.await(); } c2.signal(); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ lock.unlock(); } }); t1.start(); t2.start(); } }
最后输出结果:
使用LinkedTransferQueue实现两个线程交替打印
实现字母在前数字在后
packagecom.study.pattern; importjava.util.concurrent.LinkedTransferQueue; publicclassDemo3{ privatestaticLinkedTransferQueuelinkedC=newLinkedTransferQueue (); privatestaticLinkedTransferQueue linkedN=newLinkedTransferQueue (); publicstaticvoidmain(String[]args){ Stringc="ABCDEFGHI"; char[]ca=c.toCharArray(); Stringn="123456789"; char[]na=n.toCharArray(); Threadt1=newThread(()->{ for(charcaa:ca){ try{ linkedC.put(caa); chara=linkedN.take(); System.out.print(a); }catch(InterruptedExceptione){ e.printStackTrace(); } } }); Threadt2=newThread(()->{ for(charnaa:na){ try{ charb=linkedC.take(); System.out.print(b); linkedN.put(naa); }catch(InterruptedExceptione){ e.printStackTrace(); } } }); t1.start(); t2.start(); } }
输出结果:
使用synchronized实现两个线程交替打印
实现字母在前数字在后
packagecom.study.pattern; importjava.util.concurrent.CountDownLatch; publicclassDemo4{ privatestaticCountDownLatchcount=newCountDownLatch(1); publicstaticvoidmain(String[]args){ Stringc="ABCDEFGHI"; char[]ca=c.toCharArray(); Stringn="123456789"; char[]na=n.toCharArray(); Objectlock=newObject(); Threadt1=newThread(()->{ synchronized(lock){ count.countDown(); for(charcaa:ca){ System.out.print(caa); lock.notify(); try{ lock.wait(); }catch(InterruptedExceptione){ e.printStackTrace(); } } lock.notify(); } }); Threadt2=newThread(()->{ try{ count.await(); }catch(InterruptedExceptione){ e.printStackTrace(); } synchronized(lock){ for(charnaa:na){ System.out.print(naa); lock.notify(); try{ lock.wait(); }catch(InterruptedExceptione){ e.printStackTrace(); } } lock.notify(); } }); t1.start(); t2.start(); } }
输出结果:
使用LockSupport实现两个线程交替打印
实现字母在前数字在后
packagecom.study.pattern; importjava.util.concurrent.locks.LockSupport; publicclassDemo5{ privatestaticThreadt1; privatestaticThreadt2; publicstaticvoidmain(String[]args){ Stringc="ABCDEFGHI"; char[]ca=c.toCharArray(); Stringn="123456789"; char[]na=n.toCharArray(); t1=newThread(()->{ for(charcaa:ca){ System.out.print(caa); LockSupport.unpark(t2); LockSupport.park(); } }); t2=newThread(()->{ for(charnaa:na){ LockSupport.park(); System.out.print(naa); LockSupport.unpark(t1); } }); t1.start(); t2.start(); } }
输出结果:
以上就是java实现两个线程交替打印的详细内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。