溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用java怎么實(shí)現(xiàn)一個(gè)多線程的交替打印

發(fā)布時(shí)間:2020-11-24 14:32:17 來源:億速云 閱讀:322 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(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)容。

AI