IEwuIL7
这就是人类或者说所有的生命体追逐探索的东西
Java攀登者
没错,感觉他太僵硬了,强行搞个能量系统,都被他搞得反而更难了
霸气小肆毛
这里的“消失”是指没有放掉能量库里,消失的原因是上一个转移能量的线程拿出能量后失去了cpu的运行“时间片”,导致没有来的及往库里存能量,等他下次再次抢占到运行资格的时候,会继续完成前面没有完成的事:存储能量到能量库,这时候总量就恢复到10000了
斯基姆斯
和电脑的牌子有关,你的是和谐号的
qq_再见不再见_3
这个能量箱子肯定是不能被改写的!
JavaEEGoodeHua
。。。return z之后的代码是不会被执行的,在return后面加个
}
然后去掉最后那个}
像这样:
public void transfer(int from, int to, double amount) {
if (energyBoxes[from] < amount) {
return; // 能量转出的单元不足时,终止本次操作,否则对我们盒子能量的转入和转出进行相应的加减
}
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());
}
昵称是JaVa
return 有两种用法,一种返回值,一种跳出当前方法
昵称是JaVa
慕粉2220415365
MR_Chang常先生
是在for循环里头调用的啊,这不就是多个线程了吗。
笑傲江湖3955759
不守恒的原理视频中已经说的很清楚了,不守恒其实已经存在了,只是你把这两个写颠倒之后,不是此个线程的正确表示状态。
就比如int i = 100; 你先输入的i = i - 1; 还是先输入System.out.printfln(i)的区别
如果先写i = i - 1 ,再输出i那么i=99
如果你先输出i,那么打印输入当然是i = 100。之后再执行i = i - 1。执行结果其实已经是i = 99了,但是你打印输出的是i = 100.
yjh不畏
被final修饰的引用变量是地址值不可以改变,但是对象内的属性可以改变
被static修饰的变量会成为类变量,被本类所有对象共享.没有用,应该是不需要吧
心中的愤怒就像龙咆哮
要么实现接口Runnable要么继承Thread
main是方法入口,线程的run方法是在调用start方法后自动调用的
夜还没黑
关于输出结果。
是混乱的,也就是说,每一个单独输出的总能量在上面都有对应的缺省总能量输出的情况。
至于原因,不知道,正想搞明白。
ly李泳
就好比你去银行取钱(synchronized) 你想取10000块,但是银行只有8000块 你就会在它提供的休息室(wait Set)等待,待其他人执行完业务后会叫你(notify()),你就可以重新去排队竞争取钱,如果竞争到资源就可以再判断此时银行是否有10000块能让你取,如果可以就能顺利执行完临界区的代码,如果不可以就又去到waitSet等待被唤醒...大概就是这么个意思
红袖侍读
老师的代码加了锁的。
用户168153
必须初始化,但是不一定要在 变量声明语句(private final double[] a;) 初始化。
释迷
Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。
注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。
object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。
这回答都是一些文字来的,没有代码解释哦,哈哈!!
lisen99
乘号的意思,double amount = maxAmount * (Math.random()); 应该这样才能生成随机数吧,,,
释迷
如下:
wait():使一个线程处于等待状态,并且释放所持有的对象的lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级;
notityAll():唤醒所有处于等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让他们竞争。
chenjie6
红色按钮
快乐不假
EnergyTransferTask task = new EnergyTransferTask(eng, i, INITIAL_ENERGY); //是指为能量系统中的每个盒子(即每个元素)创建一个能量转移任务,这个任务的最大转移量是INITIAL_ENERGY(即1000)。当然初始化时,每个盒子的初始能量是INITIAL_ENERGY(即1000).
能量系统中的每个元素=能量系统中的每个盒子
我是这样理解的,不造对不对哦~
飞到死的鸟
for循环开启了100条线程,想明白了真的舒服。。。
抓一个打酱油
这节课的代码 跟下载的代码是不同的
老家伙
不会,主要是这样的:
先明白两个概念:锁池和等待池。synchronized是锁池,wait、notify、notifyAll是等待池。等待池的对象是不会竞争锁的,当notifyAll后,等待池中的线程会被唤醒进入到该线程的锁池中重新竞争对象锁,重新获得锁后的对象会从wait后继续执行代码,其他对象会被阻塞,而不是wait。被阻塞的对象会等待下一次被唤醒(notify、notifyAll)。另外,notify不是线程安全的,notifyAll才是。
qq_Faraward_0
run方法只是方法体里是你需要执行的业务逻辑。while(true)当然条件为真,那么循环必定永远执行下去。跑不出去?对啊!思路没错的,里面条件为真的循环一直在走,那么run就没有走到方法体最后一行的机会,那么run方法永远不结束,线程也不会结束。你说的是课程里那个能量守恒吧?时间在变,能量在变,所以以现实世界的逻辑套用到程序,那么就是一个永久的执行过程,没有停止的,除非宇宙大爆炸?那也不一定,炸完了能量转移了也不一定,也还没完。。。
qq_木子林夕_0
路小波0
AMgg丶
%10.2f只说明位数和精度,并不强制要求占满。如果要求部位前面加0
如饥似渴的学习IN