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

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

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

瀏覽:120日期: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久久,三上悠亚国产精品一区二区三区
欧美成人a交片免费看| 国产日韩高清一区二区三区在线| 国产精品一区二区中文字幕| 欧美日韩亚洲一区| 国产精品网址| 极品av在线| 国产精品91一区二区三区| 99在线观看免费视频精品观看| 中文一区一区三区免费在线观| 国产欧美日韩亚洲一区二区三区| 久久99国产精品视频| 91精品啪在线观看国产18| 久久av一区| 国产欧美日本| 香蕉成人av| 亚洲欧洲一区| 欧美日韩一视频区二区| 福利精品一区| 国产亚洲一区在线| 欧美亚洲tv| 欧美手机在线| 久久精品97| 亚洲不卡av不卡一区二区| 亚洲一区二区三区四区电影| 美女性感视频久久| 欧美精品自拍| 久久精品九色| 伊人精品视频| 国产欧美一区二区三区国产幕精品| 天堂中文av在线资源库| 黄色日韩在线| 欧美午夜三级| 久久精品卡一| 国产欧美日韩精品一区二区免费| 亚洲视频综合| 精品网站999| 视频精品一区二区| 黄色在线网站噜噜噜| 视频一区日韩| 99免费精品| 欧美激情五月| 亚洲三级视频| 香蕉久久精品| 精品女同一区二区三区在线观看| 美女久久一区| 精品三级久久| 日韩精品中文字幕一区二区| 亚洲a一区二区三区| 久久99性xxx老妇胖精品| 久久福利一区| 久久久久久久久久久9不雅视频| 国产欧美成人| 夜夜嗨av一区二区三区网站四季av| 精品午夜视频| 国产欧美自拍| 伊人久久亚洲| 精品欧美久久| 亚洲一区资源| 麻豆精品新av中文字幕| 日本在线视频一区二区| 西西人体一区二区| 国产不卡人人| 麻豆精品一区二区综合av| 日韩中文字幕一区二区高清99| 国产一区二区中文| а√天堂8资源在线| 国产精品一国产精品k频道56| 亚洲精品少妇| 丝袜美腿亚洲一区| 欧美不卡在线| 久久精品国产亚洲夜色av网站| 国产精品二区不卡| 另类欧美日韩国产在线| 国产日韩一区二区三区在线播放| 日韩二区在线观看| 亚洲欧美久久精品| 欧美成人精品| 欧美日韩国产传媒| 欧美不卡视频| 国产综合精品一区| 不卡在线一区二区| 在线观看免费一区二区| 久久久噜噜噜| 在线日韩电影| 久久精品国内一区二区三区水蜜桃| 精品久久99| 国产一区二区三区国产精品| 国产精品久久国产愉拍| 国产九一精品| 精品一区二区三区免费看| 国产精品s色| 国产欧美一区二区三区国产幕精品 | 久久精品动漫| 精品亚洲美女网站| 98精品视频| 91tv亚洲精品香蕉国产一区| 久久精品在线| 日韩午夜av| 亚洲精品中文字幕99999| 亚洲一区免费| 亚洲精品极品| 国产精选久久| 成人一二三区| 久久久精品日韩| 国产亚洲在线观看| 日韩精品欧美大片| 久久不见久久见国语| 成人精品动漫一区二区三区| 三级精品视频| 蜜臀精品久久久久久蜜臀| 日本视频一区二区| 久久香蕉网站| 欧美中文一区二区| 日韩在线卡一卡二| 亚洲精品日本| 久久gogo国模啪啪裸体| 高潮久久久久久久久久久久久久| 成人久久一区| 蜜臀av在线播放一区二区三区 | 欧美精品一区二区三区精品| 视频一区国产视频| 国产精品3区| 久久国产中文字幕| 视频一区日韩精品| 日韩av专区| 国产亚洲一区在线| 欧美日韩一区二区三区四区在线观看 | 亚洲精品伦理| 精品国产亚洲一区二区三区在线 | 国产欧美69| 午夜精品成人av| 免费观看在线综合| 国产精品亚洲产品| 欧美日韩一二三四| 亚洲精品少妇| 国产精品亚洲一区二区三区在线观看| 丝袜亚洲精品中文字幕一区| 久久免费精品| 久久国产高清| 色婷婷色综合| 亚洲精品人人| 色婷婷精品视频| 91综合久久爱com| 久久精品av| 国产精品久久国产愉拍| 亚洲午夜在线| 欧美欧美黄在线二区| 99久久久久国产精品| 国产伦一区二区三区| 国产高清久久| 国内自拍视频一区二区三区| 久久99伊人| 日韩欧美精品| 日韩国产欧美视频| 香蕉精品久久| 精品高清久久| 日韩在线观看一区二区三区| 色婷婷精品视频| 久久不见久久见中文字幕免费| 亚洲深夜av| 精精国产xxxx视频在线播放| 久久国内精品| 国精品一区二区三区| 国产精品久久| 免费看日韩精品| 136国产福利精品导航网址| 国产精品久久久久久av公交车| 国产亚洲一区在线| 日本蜜桃在线观看视频| 国产精品亚洲综合久久| 免费观看在线综合| 亚洲午夜91| 久久uomeier| 国产精品v日韩精品v欧美精品网站 | 偷拍精品精品一区二区三区| 日韩av网站免费在线| 亚洲欧美网站| 国产99久久| 欧美黄色网页| 高清久久一区| 精品一区不卡| 久久影院资源站| 久久精品99久久久| 亚洲日本欧美| 久久国产高清| 亚洲免费在线| 久久在线电影| 久久久久久免费视频| av高清一区| 久久精品成人| 欧美亚洲国产激情| 国产99久久久国产精品成人免费| 国产精品99视频| 精品国产午夜| 精品久久影院| 国产 日韩 欧美 综合 一区| 精品亚洲a∨一区二区三区18| 国产精品白丝久久av网站| 国产精品乱战久久久| 老司机免费视频一区二区三区|