这篇文章主要介绍了java怎么实现两个线程交替打印,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网站空间、营销软件、网站建设、利通网站维护、网站推广。使用ReentrantLock实现两个线程交替打印
实现字母在前数字在后
package com.study.pattern;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo2 {
private static Lock lock = new ReentrantLock();
private static Condition c1 = lock.newCondition();
private static Condition c2 = lock.newCondition();
private static CountDownLatch count = new CountDownLatch(1);
public static void main(String[] args) {
String c = "ABCDEFGHI";
char[] ca = c.toCharArray();
String n = "123456789";
char[] na = n.toCharArray();
Thread t1 = new Thread(() -> {
try {
lock.lock();
count.countDown();
for(char caa : ca) {
c1.signal();
System.out.print(caa);
c2.await();
}
c1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
});
Thread t2 = new Thread(() -> {
try {
count.await();
lock.lock();
for(char naa : na) {
c2.signal();
System.out.print(naa);
c1.await();
}
c2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
});
t1.start();
t2.start();
}
}最后输出结果:

使用LinkedTransferQueue实现两个线程交替打印
实现字母在前数字在后
package com.study.pattern;
import java.util.concurrent.LinkedTransferQueue;
public class Demo3 {
private static LinkedTransferQueue linkedC = new LinkedTransferQueue();
private static LinkedTransferQueue linkedN = new LinkedTransferQueue();
public static void main(String[] args) {
String c = "ABCDEFGHI";
char[] ca = c.toCharArray();
String n = "123456789";
char[] na = n.toCharArray();
Thread t1 = new Thread(() -> {
for(char caa : ca) {
try {
linkedC.put(caa);
char a = linkedN.take();
System.out.print(a);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(() -> {
for(char naa : na) {
try {
char b = linkedC.take();
System.out.print(b);
linkedN.put(naa);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
} 输出结果:

使用synchronized实现两个线程交替打印
实现字母在前数字在后
package com.study.pattern;
import java.util.concurrent.CountDownLatch;
public class Demo4 {
private static CountDownLatch count = new CountDownLatch(1);
public static void main(String[] args) {
String c = "ABCDEFGHI";
char[] ca = c.toCharArray();
String n = "123456789";
char[] na = n.toCharArray();
Object lock = new Object();
Thread t1 = new Thread(() -> {
synchronized (lock) {
count.countDown();
for(char caa : ca) {
System.out.print(caa);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
});
Thread t2 = new Thread(() -> {
try {
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
for(char naa : na) {
System.out.print(naa);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify();
}
});
t1.start();
t2.start();
}
}输出结果:

使用LockSupport实现两个线程交替打印
实现字母在前数字在后
package com.study.pattern;
import java.util.concurrent.locks.LockSupport;
public class Demo5 {
private static Thread t1;
private static Thread t2;
public static void main(String[] args) {
String c = "ABCDEFGHI";
char[] ca = c.toCharArray();
String n = "123456789";
char[] na = n.toCharArray();
t1 = new Thread(() -> {
for(char caa : ca) {
System.out.print(caa);
LockSupport.unpark(t2);
LockSupport.park();
}
});
t2 = new Thread(() -> {
for(char naa : na) {
LockSupport.park();
System.out.print(naa);
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
}输出结果:

感谢你能够认真阅读完这篇文章,希望小编分享的“java怎么实现两个线程交替打印”这篇文章对大家有帮助,同时也希望大家多多支持创新互联建站,关注创新互联网站建设公司行业资讯频道,更多相关知识等着你来学习!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。