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

      歡迎訪問 生活随笔!

      生活随笔

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

      编程问答

      JAVA多线程互斥同步例子

      發(fā)布時(shí)間:2025/3/12 编程问答 23 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 JAVA多线程互斥同步例子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
      package com.imooc.concurrent.racecondition;/*** 宇宙的能量系統(tǒng)* 遵循能量守恒定律:* 能量不會(huì)憑空創(chuàng)生或消失,只會(huì)從一處轉(zhuǎn)移到另一處*/ public class EnergySystem {//能量盒子,能量存貯的地方private final double[] energyBoxes;private final Object lockObj = new Object();/*** * @param n 能量盒子的數(shù)量* @param initialEnergy 每個(gè)能量盒子初始含有的能量值*/public EnergySystem(int n, double initialEnergy){energyBoxes = new double[n];for (int i = 0; i < energyBoxes.length; i++)energyBoxes[i] = initialEnergy;}/*** 能量的轉(zhuǎn)移,從一個(gè)盒子到另一個(gè)盒子* @param from 能量源* @param to 能量終點(diǎn) * @param amount 能量值*/public void transfer(int from, int to, double amount){synchronized(lockObj){// if (energyBoxes[from] < amount) // return;//while循環(huán),保證條件不滿足時(shí)任務(wù)都會(huì)被條件阻擋//而不是繼續(xù)競(jìng)爭(zhēng)CPU資源while (energyBoxes[from] < amount){try {//條件不滿足, 將當(dāng)前線程放入Wait SetlockObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(Thread.currentThread().getName());energyBoxes[from] -= amount;System.out.printf("從%d轉(zhuǎn)移%10.2f單位能量到%d", from, amount, to);energyBoxes[to] += amount;System.out.printf(" 能量總和:%10.2f%n", getTotalEnergies());//喚醒所有在lockObj對(duì)象上等待的線程lockObj.notifyAll();}}/*** 獲取能量世界的能量總和 */public double getTotalEnergies(){double sum = 0;for (double amount : energyBoxes)sum += amount;return sum;}/*** 返回能量盒子的長(zhǎng)度*/public int getBoxAmount(){return energyBoxes.length;}}

      package com.imooc.concurrent.racecondition;public class EnergyTransferTask implements Runnable{//共享的能量世界private EnergySystem energySystem;//能量轉(zhuǎn)移的源能量盒子下標(biāo)private int fromBox;//單次能量轉(zhuǎn)移最大單元private double maxAmount;//最大休眠時(shí)間(毫秒)private int DELAY = 10;public EnergyTransferTask(EnergySystem energySystem, int from, double max){this.energySystem = energySystem;this.fromBox = from;this.maxAmount = max;}public void run() {try{while (true){int toBox = (int) (energySystem.getBoxAmount()* Math.random());double amount = maxAmount * Math.random();energySystem.transfer(fromBox, toBox, amount);Thread.sleep((int) (DELAY * Math.random()));}}catch (InterruptedException e){e.printStackTrace();}}} package com.imooc.concurrent.racecondition;public class EnergySystemTest {//將要構(gòu)建的能量世界中能量盒子數(shù)量public static final int BOX_AMOUNT = 100;//每個(gè)盒子初始能量public static final double INITIAL_ENERGY = 1000;public static void main(String[] args){EnergySystem eng = new EnergySystem(BOX_AMOUNT, INITIAL_ENERGY);for (int i = 0; i < BOX_AMOUNT; i++){EnergyTransferTask task = new EnergyTransferTask(eng, i, INITIAL_ENERGY);Thread t = new Thread(task,"TransferThread_"+i);t.start();}}}


      總結(jié)

      以上是生活随笔為你收集整理的JAVA多线程互斥同步例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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