日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java實現多線程輪流打印1-100的數字操作

瀏覽:121日期:2022-08-26 09:16:08

首先打印1-100數字如果用一個單線程實現那么只要一個for循環即可,那么如果要用兩個線程打印出來呢?(一個線程打印奇數,一個線程打印偶數)于是大家會想到可以通過加鎖實現,但是這樣的效率是不是不高?這里我用一個變量來控制兩個線程的輸出

public class ThreadTest { volatile int flag=0; public void runThread() throws InterruptedException{ Thread t1=new Thread(new Thread1()); Thread t2=new Thread(new Thread2()); t1.start(); t2.start(); } public class Thread1 implements Runnable{ public void run() { int i=0; while(i<=99){ if(flag==0) { System.out.println('t1='+i+'flag='+flag); i+=2; flag=1; } } } } public class Thread2 implements Runnable{ public void run() { int i=1; while(i<=99){ if(flag==1) { System.out.println('t2='+i+'flag='+flag); i+=2; flag=0; } } } }}

那么如果要實現三個線程輪流打印1-100的數字呢?是不是也可以用上面的方法實現呢?代碼如下

public class ThreadTest { private int i=0; private Thread thread1,thread2,thread3; private int flag=0; public void runThread() throws InterruptedException{ thread1=new Thread(new Thread1()); thread2=new Thread(new Thread2()); thread3=new Thread(new Thread3()); thread1.start(); thread2.start(); thread3.start(); } public class Thread1 implements Runnable{ public void run() { while(i<=100){ if(flag==0) { System.out.println('t1='+i); i++; flag=1; } } } } public class Thread2 implements Runnable{ public void run() { while(i<=100){ if(flag==1) { System.out.println('t2='+i); i++; flag=2; } } } } public class Thread3 implements Runnable{ public void run() { while(i<=100){ if(flag==2) { System.out.println('t3='+i); i++; flag=0; } } } }}

運行結果

Java實現多線程輪流打印1-100的數字操作

發現三個線程只打印了一次就停止不輸出了,是什么原因呢?

可以用jdk自帶的jstack來看看線程的狀態,在windows系統中可以打開cmd然后進入jdk所在目錄,然后執行Jsp,能查看到各線程id,然后執行jstack -F pid就可以看的狀態了

Java實現多線程輪流打印1-100的數字操作

可以看到幾個Thread state是BLOCKED,就是阻塞了,什么原因呢?

尷尬發現flag變量和i變量前面忘記加volatile,導致flag和i被線程讀取修改時,其他線程不可見,所以才導致上面的問題出現。

在JVM中每個線程讀取變量到cache中時相互都是不可見的,也就是java五大內存區中的程序計數器區域對于每個線程都是獨立的不共享的,只有堆內存區和方法區是對所有線程都是共享的。

當線程1讀取了flag和i的值,并對其進行修改的時候,線程2并發運行,并不知道flag和i值已經改變,導致多線程數據不一致的情況,所以加了volatile后,當線程讀取變量進行修改后會“通知”其它線程這個值已經進行了修改。

import java.util.concurrent.atomic.AtomicInteger; public class ThreadTest { private volatile int i=0; private Thread thread1,thread2,thread3; private volatile int flag=0; public void runThread() throws InterruptedException{ thread1=new Thread(new Thread1()); thread2=new Thread(new Thread2()); thread3=new Thread(new Thread3()); thread1.start(); thread2.start(); thread3.start(); } public class Thread1 implements Runnable{ public void run() { while(i<100){ if(flag==0) { System.out.println('t1='+i); i++; flag=1; } } } } public class Thread2 implements Runnable{ public void run() { while(i<100){ if(flag==1){ System.out.println('t2='+i); i++; flag=2; } } } } public class Thread3 implements Runnable{ public void run() { while(i<100){ if(flag==2){ System.out.println('t3='+i); i++; flag=0; } } } }}

運行結果

Java實現多線程輪流打印1-100的數字操作

-----未完-----

補充知識:Java n個線程輪流打印數字的問題

一、兩個線程輪流打印數字。

加鎖實現:

package lianxi; /* * 用鎖實現兩個線程輪流打印1——100 */public class Print1TO100TwoThread { private Object lock = new Object(); private int i = 0; Thread threadA = new Thread(new Runnable() { @Override public void run() { while (i <= 100) { synchronized (lock) { try { if (i > 100) break; System.out.println('threadA :' + (i++)); lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { while (i <= 100) { synchronized (lock) { try { if (i > 100) break; System.out.println('threadB :' + (i++)); lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); public void startTwoThread() throws InterruptedException { threadA.start(); Thread.sleep(20); threadB.start(); } public static void main(String[] args) throws InterruptedException { new Print1TO100TwoThread().startTwoThread(); } }

用鎖效率太低,用一個變量來控制打印的順序。

package lianxi;/* * 用兩個線程輪流打印1——10;用所實現效率太低,用變量來控制 */public class PrinntNumTwoThread { private volatile int num = 0; private volatile boolean flag = false; Thread threadA = new Thread(new Runnable() { @Override public void run() { while (true) { if (num > 10) return; if (!flag) { System.out.println('threadA-->' + ':' + (num++)); flag = !flag; } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { while (true) { if (num > 10) return; if (flag) { System.out.println('threadB-->' + ':' + (num++)); flag = !flag; } } } }); public void startTwoThread() { threadA.start(); threadB.start(); } public static void main(String[] args) { new PrinntNumTwoThread().startTwoThread(); }}

二、那么如果要實現三個線程輪流打印1-100的數字呢?

package lianxi; public class PrintNumThreeThread { private volatile int i = 0; private volatile int flag = 0; Thread threadA = new Thread(new Runnable() { @Override public void run() { while (true) { if (i > 100) return; if (flag == 0) { System.out.println('threadA->' + ':' + (i++)); flag = 1; } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { while (true) { if (i > 100) return; if (flag == 1) { System.out.println('threadB->' + ':' + (i++)); flag = 2; } } } }); Thread threadC = new Thread(new Runnable() { @Override public void run() { while (true) { if (i > 100) return; if (flag == 2) { System.out.println('threadC->' + ':' + (i++)); flag = 0; } } } }); public void startThreeThread() { threadA.start(); threadB.start(); threadC.start(); } public static void main(String[] args) { new PrintNumThreeThread().startThreeThread(); }}

以上這篇Java實現多線程輪流打印1-100的數字操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕亚洲精品乱码| 另类av一区二区| 精品免费av| 欧美天堂视频| 欧美午夜不卡| 日韩不卡一区二区| 97精品中文字幕| 在线综合亚洲| 国产精品hd| 91成人精品视频| 青青草国产成人99久久| 国产激情在线播放| 亚洲欧美日本视频在线观看| 午夜精品婷婷| 91亚洲国产| 日本精品影院| 99精品视频精品精品视频| 国产一区清纯| 美女精品在线观看| 日本午夜精品久久久| 69堂精品视频在线播放| 国产精品久久久久久久久久齐齐 | 亚洲激情二区| 国产欧美日韩在线观看视频| 欧美日韩一区二区三区视频播放| 中文字幕日韩高清在线| 欧美一区二区性| 亚洲一区二区小说| 国产精品毛片aⅴ一区二区三区| 精品香蕉视频| 国产精品蜜月aⅴ在线| 狠狠久久伊人中文字幕| 日韩中文字幕不卡| 色乱码一区二区三区网站| 水蜜桃久久夜色精品一区的特点| 国产91在线播放精品| 日韩中文字幕不卡| 欧美精选视频一区二区| 日韩激情啪啪| 亚洲成人一区| 国产黄色精品| 欧美中文日韩| 久久久久国产精品一区二区| 国产一精品一av一免费爽爽| 黄色亚洲在线| 国产高潮在线| 久久国产欧美日韩精品| 国产亚洲永久域名| 在线观看精品| 国产精品magnet| 亚洲日产国产精品| 激情综合激情| 丰满少妇一区| 91成人小视频| 国产一区白浆| 亚洲va中文在线播放免费| 69精品国产久热在线观看| 怡红院精品视频在线观看极品| 国产欧洲在线| 欧美xxxx性| 日韩高清欧美激情| 97精品视频在线看| 四虎4545www国产精品 | 婷婷激情图片久久| 久久a爱视频| 99精品99| 神马久久午夜| 日韩福利视频网| 欧美亚洲国产日韩| 香蕉成人av| 欧美日韩在线观看首页| 久久香蕉网站| 国产精品一页| 日韩精品一页| 中文字幕一区二区三区日韩精品 | 久久精品二区亚洲w码| 日韩黄色在线观看| 亚洲人成亚洲精品| 视频在线观看国产精品| 不卡在线一区| 99精品在线观看| 日韩欧美一区二区三区免费看| 国产一区二区三区黄网站| 国产精品最新自拍| 欧美另类中文字幕| 欧美日韩91| 日本精品国产| 五月亚洲婷婷 | 国产成人精品一区二区三区视频 | 日韩一区精品视频| 日本不卡高清| 视频一区中文字幕国产| 久久国产影院| 中文在线а√天堂| 国内自拍视频一区二区三区| 国产精品一区二区99| 午夜久久av| 日韩午夜电影| 99久久精品网站| av最新在线| 久久精品一本| 91精品国产自产精品男人的天堂 | 中文字幕日本一区二区| 蜜臀精品一区二区三区在线观看| 欧美激情视频一区二区三区在线播放| 亚洲精品裸体| 麻豆9191精品国产| 亚洲激情精品| 免费观看不卡av| 亚洲天堂日韩在线| 免费看黄色91| 亚洲一级淫片| 国产欧美日韩影院| 成人在线视频中文字幕| 欧洲一级精品| 欧美午夜不卡| 亚洲乱码久久| 国产精品亲子伦av一区二区三区| 久久精品国产免费| 日韩一区亚洲二区| 亚洲精品123区| 亚洲精品综合| 欧美欧美黄在线二区| 精品日产乱码久久久久久仙踪林| 日本午夜大片a在线观看| 午夜欧美视频| 亚洲专区视频| 国产精品22p| 午夜av成人| 亚洲香蕉久久| 久久精品亚洲一区二区| 亚洲午夜av| 偷拍亚洲精品| 精品久久一区| 欧美在线资源| 欧美日韩一区二区三区四区在线观看| 成人一二三区| 99在线精品免费视频九九视| 日本aⅴ亚洲精品中文乱码| 精品视频自拍| 国产高清一区| 日韩精品一区二区三区免费视频 | 国产精品主播在线观看| 久久精品福利| 久久久久亚洲| 国产精品美女| 日韩av资源网| 另类小说一区二区三区| 日韩大片在线| 亚洲欧美日韩国产一区| 日韩av黄色在线| 精品久久福利| 日韩精品91| 免费一级片91| 国产黄色精品| 久久国产66| 国产欧美88| 99精品小视频| 国产精品中文字幕亚洲欧美| 午夜精品网站| 久久免费视频66| 日韩欧美三区| 欧美国产另类| japanese国产精品| 欧美亚洲自偷自偷| 日韩成人亚洲| 日日夜夜免费精品| 99久久激情| 欧美亚洲三级| 一本色道精品久久一区二区三区| 精品一区av| 中文不卡在线| 久久免费高清| 欧美成a人片免费观看久久五月天| 亚洲欧美视频| 97人人精品| 欧美亚洲综合视频| 欧美日韩国产亚洲一区| 国产一区二区三区四区| 日本一区中文字幕| 午夜国产精品视频免费体验区| 国产成人久久| 亚洲精品一二| 五月综合激情| 韩国久久久久久| 国产亚洲精品精品国产亚洲综合| 一区在线免费| 欧美日韩视频免费观看| 你懂的网址国产 欧美| 亚洲乱码一区| 中文亚洲免费| 欧美综合另类| 欧美日韩在线观看首页| 国产精品久久久久久av公交车| 麻豆久久精品| 激情五月综合网| 樱桃视频成人在线观看| 国产日产高清欧美一区二区三区 | 成人精品国产亚洲| 欧美日韩精品一区二区三区视频 |