 
		小不点2016
2016-07-29 20:13
我按照视频中的代码重写了一编,发现在运行时经常会不出数据,但是程序还没子啊运行,是不是死锁
 
				这个设置了,这是我的代码,我跟视频上不完全一样,一个是测试,一个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();
         }
        
	}
} 
				对着视频再检查一下吧,
你看一下run方法里的amount有没有写对,double amount=maxAmount*Math.random();
transfer的时候amout必须满足amount<=amxAmount,不然就会造成死锁
深入浅出Java多线程
186065 学习 · 502 问题
相似问题