日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多线程交替打印_java实现多线程交替打印

發(fā)布時(shí)間:2024/7/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程交替打印_java实现多线程交替打印 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文實(shí)例為大家分享了java實(shí)現(xiàn)多線程交替打印的具體代碼,供大家參考,具體內(nèi)容如下

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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持云海天教程。

原文鏈接:https://blog.csdn.net/weixin_43292547/article/details/109955789

總結(jié)

以上是生活随笔為你收集整理的java多线程交替打印_java实现多线程交替打印的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。