您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)使用java怎么實(shí)現(xiàn)一個(gè)多線程的交替打印,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
notify+wait實(shí)現(xiàn)
import org.junit.Test; import java.util.concurrent.*; public class TestThreadLocal { Object o = new Object(); CountDownLatch c=new CountDownLatch(2); @Test public void vvvvvvvv() throws InterruptedException { Thread t1 = new Thread() { @Override public void run() { for (int i = 0; i < 26; i++) { synchronized (o) { System.out.print((char) (65 + i)); o.notify(); try { if(i<25)o.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } c.countDown(); } }; Thread t2 = new Thread() { @Override public void run() { for (int i = 0; i < 26; i++) { synchronized (o) { System.out.print(1 + i); o.notify(); try { if(i<25)o.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } c.countDown(); } }; t1.start(); t2.start(); //t1.join(); //t2.join(); c.await(); } }
A1B2C3D4E5F6G7H8I9J10K11L12M13N14O15P16Q17R18S19T20U21V22W23X24Y25Z26
t2可能先執(zhí)行,notify(只隨機(jī)喚醒一個(gè) wait 線程)改成notifyAll(喚醒所有 wait 線程)更好。
這兩個(gè)方法只喚醒,被喚醒的線程處于runnable狀態(tài)。想交替執(zhí)行,需要負(fù)責(zé)喚醒的線程自己阻塞。
LockSupport實(shí)現(xiàn)
import org.junit.Test; import java.util.concurrent.*; import java.util.concurrent.locks.LockSupport; public class TestThreadLocal { CountDownLatch c=new CountDownLatch(2); Thread t1 ,t2; @Test public void vvvvvvvv() throws InterruptedException { t1 = new Thread() { @Override public void run() { for (int i = 0; i < 26; i++) { System.out.print((char) (65 + i)); LockSupport.unpark(t2); LockSupport.park(); } c.countDown(); } }; t2 = new Thread() { @Override public void run() { for (int i = 0; i < 26; i++) { LockSupport.park(); System.out.print(1+i); LockSupport.unpark(t1); } c.countDown(); } }; t1.start(); t2.start(); //t1.join(); //t2.join(); c.await(); } }
unpark調(diào)用時(shí),如果當(dāng)前線程還未進(jìn)入park,則許可為true;
park調(diào)用時(shí),判斷許可是否為true,如果是true,則繼續(xù)往下執(zhí)行;如果是false,則等待,直到許可為true。
如果t2先執(zhí)行,會(huì)park讓t1先執(zhí)行。如果t1先執(zhí)行,打印后unpark t2,保證兩個(gè)線程不會(huì)同時(shí)阻塞。
如果t2的LockSupport.park()和System.out.print(1+i)交換位置,可能出現(xiàn)t2連續(xù)打印兩次的情況。
即t1打印后,執(zhí)行unpartk(t2)前t2打印一次,然后t1 unpark t2后t2搶在t1前再打印一次。
看完上述內(nèi)容,你們對使用java怎么實(shí)現(xiàn)一個(gè)多線程的交替打印有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。