当前位置:网站首页>三个不同线程顺序打印ABC十种写法【并发编程JUC】
三个不同线程顺序打印ABC十种写法【并发编程JUC】
2022-06-22 08:33:00 【BreezAm】
夫陶公
清风千古,余又何人,敢称庶几
个人博客地址:http://www.breez.work
写法一:使用信号量Semaphore
public class Foo {
private Semaphore semaphoreB = new Semaphore(0);
private Semaphore semaphoreC = new Semaphore(0);
public Foo() {
}
public void first() throws InterruptedException {
System.out.println("A");
semaphoreB.release();
}
public void second() throws InterruptedException {
semaphoreB.acquire();
System.out.println("B");
semaphoreC.release();
}
public void third() throws InterruptedException {
semaphoreC.acquire();
System.out.println("C");
}
}
写法二:加synchronized锁
public class Foo {
private Object lock = new Object();
private boolean a;
private boolean b;
public Foo() {
}
public void first() throws InterruptedException {
synchronized (lock) {
System.out.println("A");
a = true;
lock.notifyAll();
}
}
public void second() throws InterruptedException {
synchronized (lock) {
while (!a) {
lock.wait();
}
System.out.println("B");
b = true;
lock.notifyAll();
}
}
public void third() throws InterruptedException {
synchronized (lock) {
while (!b) {
lock.wait();
}
System.out.println("C");
}
}
}
写法三:使用原子AtomicInteger
public class Foo {
private AtomicInteger a2 = new AtomicInteger(0);
private AtomicInteger a3 = new AtomicInteger(0);
public Foo() {
}
public void first() throws InterruptedException {
System.out.println("A");
a2.incrementAndGet();
}
public void second() throws InterruptedException {
while (a2.get() != 1) {
}
System.out.println("B");
a3.incrementAndGet();
}
public void third() throws InterruptedException {
while (a3.get() != 1) {
}
System.out.println("C");
}
}
写法四:使用队列BlockingQueue
public class Foo {
BlockingQueue<String> queue2 = new ArrayBlockingQueue<>(1);
BlockingQueue<String> queue3 = new ArrayBlockingQueue<>(1);
public Foo() {
}
public void first() throws InterruptedException {
System.out.println("A");
queue2.offer("b");
}
public void second() throws InterruptedException {
while (queue2.size() == 0) {
}
System.out.println("B");
queue3.offer("c");
}
public void third() throws InterruptedException {
while (queue3.size() == 0) {
}
System.out.println("C");
}
}
写法五:使用Condition
public class Foo {
private int number = 1;
private Lock lock = new ReentrantLock();
private Condition a = lock.newCondition();
private Condition b = lock.newCondition();
private Condition c = lock.newCondition();
public Foo() {
}
public void first() throws InterruptedException {
lock.lock();
try {
while (number != 1) {
a.await();
}
System.out.println("A");
number = 2;
b.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void second() throws InterruptedException {
lock.lock();
try {
while (number != 2) {
b.await();
}
System.out.println("B");
number = 3;
c.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void third() throws InterruptedException {
lock.lock();
try {
while (number != 3) {
c.await();
}
System.out.println("C");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
写法六:使用计数器CountDownLatch
public class Foo {
private CountDownLatch c2 = new CountDownLatch(1);
private CountDownLatch c3 = new CountDownLatch(1);
public Foo() {
}
public void first() throws InterruptedException {
System.out.println("A");
c2.countDown();
}
public void second() throws InterruptedException {
c2.await();
System.out.println("B");
c3.countDown();
}
public void third() throws InterruptedException {
c3.await();
System.out.println("C");
}
}
测试代码
public static void main(String[] args) throws InterruptedException {
Foo foo = new Foo();
new Thread(() -> {
try {
foo.first();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "A").start();
new Thread(() -> {
try {
foo.second();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "B").start();
new Thread(() -> {
try {
foo.third();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "C").start();
}
欢迎加入BreezAm技术交流群:3861 35311 【QQ群】
边栏推荐
猜你喜欢
随机推荐
C # read / write TXT file to listview
18 intermediary model
JVM memory overflow
Flask blog practice - realize the article list page and details page
Any to Any 实时变声的实现与落地丨RTC Dev Meetup
Flask blog practice - realize article management
Interpreting the technology group in maker Education
Flask博客实战 - 实现文章列表页及详情页
16 解释器模式
07 adapter mode
Email giant exposes serious vulnerability, user data is stolen
Detailed explanation of the underlying principle of concurrent thread pool and source code analysis
Flask blog practice - display the navigation menu and home page data of the whole site
Analyzing the role of cognitive theory in maker teacher training
12 yuan sharing mode
Mysql5.6.36 tutorial
矩阵分解
Basic operation knowledge of DML and DQL
读取jar包里面文件夹下的所有文件
Do not use primitive types in new code during the use of generic types











