欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

三个不同线程顺序打印ABC十种写法,看到就是赚到!

发布时间:2024/9/27 编程问答 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 三个不同线程顺序打印ABC十种写法,看到就是赚到! 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

夫陶公清风千古,余又何人,敢称庶几

个人博客地址: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群】

总结

以上是生活随笔为你收集整理的三个不同线程顺序打印ABC十种写法,看到就是赚到!的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。