为了账号安全,请及时绑定邮箱和手机立即绑定

能量守恒中是否会出死锁的问题?

我按照视频中的代码重写了一编,发现在运行时经常会不出数据,但是程序还没子啊运行,是不是死锁

正在回答

2 回答

这个设置了,这是我的代码,我跟视频上不完全一样,一个是测试,一个thread,谢谢了

package project_thread;



public class EnergyThread extends Thread {
	
	
	private final double[] energy_box;
	private double energy_max;
	private Object lock=new Object();
     @Override
    public void run() {
    	// TODO Auto-generated method stub
    	
    	 while (true) {
			int from=(int) (Math.random()*getlength());
			int to =(int) (Math.random()*getlength());
			double energy=Math.random()*energy_max;
			int time=(int) (Math.random()*50);
			energy_tansform(from, to, energy);
			try {
				sleep(time);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
    }
     public EnergyThread(double energy_initial,int  n) {
		// TODO Auto-generated constructor stub
    	 this.energy_box=new double[n];
    	 this.energy_max=energy_initial;
    	 for (int i = 0; i < n; i++) {
			energy_box[i]=energy_initial;
		}
	}
     
     public int getenergy_total() {
    	 double total=0;
    	 for (double d : energy_box) {
			total+=d;
		}
		return (int)total;
	}
     
     public void energy_tansform(int from,int to ,double energy) {
		synchronized (lock) {
			if(energy_box[from]<energy){
				try {
					lock.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			energy_box[from]-=energy;
			energy_box[to]+=energy;
			System.out.println(getName()+":energy_box["+from+"]向energy_box["+to+"]转移"+energy+"energy_total="+getenergy_total());
			lock.notifyAll();
		}
	}
     
     public int  getlength() {
		return energy_box.length;
	}
}
package project_thread;

public class ThreadTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        
         for(int i=0;i<100;i++){
        	 Thread thread=new EnergyThread(1000,100);
        	 thread.start();
         }
        
	}

}


0 回复 有任何疑惑可以回复我~

对着视频再检查一下吧,

你看一下run方法里的amount有没有写对,double amount=maxAmount*Math.random();

transfer的时候amout必须满足amount<=amxAmount,不然就会造成死锁

0 回复 有任何疑惑可以回复我~
#1

小不点2016 提问者

因为字数的限制,我把代码完全复制到底下,麻烦了
2016-07-31 回复 有任何疑惑可以回复我~
#2

SilenceDean 回复 小不点2016 提问者

我试了一下,的确会出现这种情况,应该是死循环导致的,这个只是用来理解同步的例子,模拟理论上体系内永久能量守恒, 正常情况下会用1个flag退出循环
2016-07-31 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

能量守恒中是否会出死锁的问题?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信