线程互斥与同步案例 约定不等于承诺〃 2022-06-16 05:44 200阅读 0赞 一共有100个盒子,每个盒子中有一定数量的能量,每个线程持有一个盒子,向其他盒子中注入能量,实现能量守恒。 public class EnergySystem { //能量盒子,能量存储的地方 private final double[] energyBoxes; private final Object lockObj=new Object(); /** * @param n 能量盒子的数量 * @param initialEnergy 每个能量盒子初始含有的能量 */ public EnergySystem(int n,double initialEnergy){ energyBoxes=new double[n]; for(int i=0;i<energyBoxes.length;i++) energyBoxes[i]=initialEnergy; } /** * 能量转移,从一个盒子到另一个盒子 */ public void transfer(int from,int to,double amount){ synchronized (lockObj){ while(energyBoxes[from]<amount) try { lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print(Thread.currentThread().getName()); energyBoxes[from]-=amount; System.out.printf("从%d转移%10.2f单位能量到%d",from,amount,to); energyBoxes[to]+=amount; System.out.printf("能量总和:%10.2f%n",getTotalEnergies()); //往其他盒子中加过能量,可能就造成某个等待的线程不需要等待 //因为不知道应该唤醒哪个线程,所以唤醒所有的线程 lockObj.notifyAll(); } } /** * 获取能量世界的能量总和 */ public double getTotalEnergies(){ double sum=0; for(double amount:energyBoxes) sum+=amount; return sum; } /** * 返回能量盒子的长度 */ public int getBoxAmount(){ return energyBoxes.length; } } public class EnergyTransferTask implements Runnable{ //共享的能量世界 private EnergySystem energySystem; //能量转移的源能量盒子下标 private int fromBox; //单次能量转移最大单元 private double maxAmount; //最大休眠时间 private int DELAY=10; public EnergyTransferTask(EnergySystem energySystem,int from,double max){ this.energySystem=energySystem; this.fromBox=from; this.maxAmount=max; } @Override 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(); } } } public class EnergySystemTest { //将要构建的能量世界中能量盒子数量 public static final int BOX_AMOUNT=100; //每个盒子初始能量 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(); } } }
相关 Java多线程问题:同步与互斥 在Java编程中,"同步与互斥"是多线程并发控制的重要概念。 1. 同步: - **synchronized**关键字:这是最常用的同步方式。它可以作用于代码块或者方法 落日映苍穹つ/ 2024年09月14日 21:27/ 0 赞/ 15 阅读
相关 Java多线程实践:同步与互斥 在Java多线程编程中,"同步与互斥"是两个核心的概念。 1. 同步(Synchronized): - 使用synchronized关键字修饰代码块或者方法。 - 古城微笑少年丶/ 2024年09月11日 07:54/ 0 赞/ 18 阅读
相关 并发编程难题:Java多线程同步与互斥案例 在Java多线程编程中,同步和互斥是两个重要的概念,用于保证共享资源的正确使用。 1. **同步(Synchronization)**: - **锁(Locks)**: 迈不过友情╰/ 2024年09月10日 13:24/ 0 赞/ 23 阅读
相关 线程与同步之二——互斥量 我们可以通过pthread提供的互斥量接口来保护我们的数据,确保每次只有一个线程访问。从本质上说就是一把锁,我们在访问共享数据的时候设置(上锁),在访问完成后释放(解锁)。当 喜欢ヅ旅行/ 2022年09月20日 12:37/ 0 赞/ 215 阅读
相关 Linux多线程的同步与互斥 一、共享资源的使用 1. 由于同一进程下的多线程是共用地址空间,因此就要考虑共享资源的使用。如果没有一定的规则,那么共享资源的内容就会显得杂乱无章,这里引入了同步与互斥的概念 Bertha 。/ 2022年07月15日 04:54/ 0 赞/ 199 阅读
相关 线程互斥与同步案例 一共有100个盒子,每个盒子中有一定数量的能量,每个线程持有一个盒子,向其他盒子中注入能量,实现能量守恒。 public class EnergySystem { 约定不等于承诺〃/ 2022年06月16日 05:44/ 0 赞/ 201 阅读
相关 Linux----线程(同步与互斥) 在之前接触线程的时候,对它还不算特别了解,所以写出的总结就比较浅[浅谈Linux线程][Linux] 今天在之前博客的基础上在重新总结一下。 就不去解释线程的基本概念了 小鱼儿/ 2022年05月28日 12:11/ 0 赞/ 274 阅读
还没有评论,来说两句吧...