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();
privatestaticLinkedTransferQueuelinkedN=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。