java實現(xiàn)兩個線程交替打印的實例代碼
使用ReentrantLock實現(xiàn)兩個線程交替打印
實現(xiàn)字母在前數(shù)字在后
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();
}
}
最后輸出結(jié)果:

使用LinkedTransferQueue實現(xiàn)兩個線程交替打印
實現(xiàn)字母在前數(shù)字在后
package com.study.pattern;
import java.util.concurrent.LinkedTransferQueue;
public class Demo3 {
private static LinkedTransferQueue<Character> linkedC = new LinkedTransferQueue<Character>();
private static LinkedTransferQueue<Character> linkedN = new LinkedTransferQueue<Character>();
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();
}
}
輸出結(jié)果:

使用synchronized實現(xiàn)兩個線程交替打印
實現(xiàn)字母在前數(shù)字在后
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();
}
}
輸出結(jié)果:

使用LockSupport實現(xiàn)兩個線程交替打印
實現(xiàn)字母在前數(shù)字在后
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();
}
}
輸出結(jié)果:

以上就是java實現(xiàn)兩個線程交替打印的詳細(xì)內(nèi)容,感謝大家的學(xué)習(xí)和對腳本之家的支持。
相關(guān)文章
SpringBoot 集成 ShedLock 分布式鎖的示例詳解
ShedLock是一個在分布式環(huán)境中使用的定時任務(wù)框架,用于解決在分布式環(huán)境中的多個實例的相同定時任務(wù)在同一時間點重復(fù)執(zhí)行的問題,本文重點給大家介紹SpringBoot 分布式鎖ShedLock的相關(guān)知識,感興趣的朋友一起看看吧2021-08-08
Java客戶端通過HTTPS連接到Easysearch實現(xiàn)過程
這篇文章主要為大家介紹了Java客戶端通過HTTPS連接到Easysearch實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

