日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/9/27 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三个不同线程顺序打印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十种写法,看到就是赚到!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。