创建一个energysystem类
声明一个double类型的数组energyboxes
定义一个带有int 和 double 类型的参数的构造方法,在其中初始化定义的数组,并传值
定义一个带有int int double 参数的方法,当能量源的能量不足时,终止本次操作,反之输出从哪里转多少能量到哪里和转移后能量总和
定义一个获取能量总和的方法和返回能量盒子长度的方法
创建一个energytransfertask类,实现runnable接口
在构造方法中初始化energysystem,fromBox(数组下标),maxAmount(单次最大传输能量单位)
使用接口提供的run(),写一个while死循环,随机生成结束地点和能量值,调用transfer方法,线程休眠随机时间
线程常用方法
1.获取线程名称:getName();
2.取得当前线程对象:currentThread();
3.判断是否启动:isAlive();
4.强行运行:join();
5.线程休眠:sleep();
6.线程礼让:yield();
线程停止:
1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。
2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。
3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。
什么时候使用thread 什么时候使用runnable
其实两种方式效果一样,但推荐使用runnable
因为Java是单继承,继承了thread就不能继承其他的类
而实现runnable接口的话,扩展性要好很多
final 关键字作用
修饰类则该类不可以被继承
修饰方法则该方法不可以被重写
修饰变量则该变量一旦初始化则不可再更改。如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
无符号右移:>>>:当数据进行右移时,高位出现的空位,无论高位是什么,空位都用0补。
右移位运算:>>:右移几位,其实就是该数据除以2的几次幂,对于高位出现的空位,原来高位是什么,就用什么补这个空位,保证符号位,(负数
)
位移运算符:<< :可以完成2的次幂运算;
左移几位就是该数据乘以2的几次方。
异或:一个数异或同一数异或两次,结果为异或的数
异或:和或运算只有一点不一样,即真异或真为假
单或,双或,单与,双与运算的规律,
Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值
System.out.printf ()
System类中out对象的printf方法
使用指定格式字符串和参数将格式化的字符串写入此输出流的便捷方法。
调用此方法的 out.printf(l, format, args) 形式,行为与以下调用完全相同:
out.format(l, format, args)
参数:
l - 格式化过程中应用的 locale。如果 l 为
null,则不应用本地化。
format - 在格式字符串的语法中描述的格式字符串
args -
格式字符串中的格式说明符引用的参数。如果参数多于格式说明符,则忽略额外的参数。参数的数量是可变的,并且可以为零。参数的最大数量受到 Java Virtual Machine
Specification 定义的 Java 数组的最大维数的限制。针对 null 参数的行为依赖于 conversion。
返回:
此输出流
抛出:
IllegalFormatException -
如果格式字符串包含非法语法、与给定参数不兼容的格式说明符、对给定格式字符串而言不够充足的参数或其他非法条件。有关所有可能的格式错误的规范,请参阅
formatter 类规范的详细信息部分。
NullPointerException - 如果 format 为 null
sum+=amount; 意思为sum = sum + amount ; 的意思
energyBoxes[from]-=amount; 意思为energyBoxes[from]=energyBoxes[from]-amount;
energyBoxes[to]+=amount; 意思为energyBoxes[to]=energyBoxes[to]+amount;
final 修饰的变量,可以直接赋值,或者在构造中赋值
如果final修饰的是局部变量,在代码块中只能赋值一次
线程常用方法
1.获取线程名称:getName();
2.取得当前线程对象:currentThread();
3.判断是否启动:isAlive();
4.强行运行:join();
5.线程休眠:sleep();
6.线程礼让:yield();
线程停止:
1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。
2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。
3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。
什么时候使用thread 什么时候使用runnable
其实两种方式效果一样,但推荐使用runnable
因为Java是单继承,继承了thread就不能继承其他的类
而实现runnable接口的话,扩展性要好很多
%d输出整数 %10.2f 输出浮点数,小数点前10位,小数点后2位 %n 换行 system.out.printf("从%d转义%10.2f单位能量到%d%n",int,double,int")
http://www.cnblogs.com/riskyer/p/3263032.html
线程停止:<br> 1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。<br> 2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。<br> 3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。 System.out.print();-------------格式化输出 ①.%d-----------输出整数 ②.%10.2f-------输出一个浮点数,小数点前有10位,小数点后为2位 ③.%n-----------换行
格式输出 System.out.printf("从d%转移到%10.2f单位能量到%d".from,amount,to);
1.获取线程名称:getName(); 2.取得当前线程对象:currentThread(); 3.判断是否启动:isAlive(); 4.强行运行:join(); 5.线程休眠:sleep(); 6.线程礼让:yield();