目录
(2)JVM的运行环境类 java.lang.Runtime
【线程补充】
1. 守护线程
(1)什么是守护线程,有什么特点
线程分为被守护线程和守护线程
当系统中所有的被守护线程都结束之后,守护线程就算自己的事情没有做完,也会自动结束
即系统中不会只有守护线程在单独运行
如:GC线程就是守护线程
(2)如何设置线程为守护线程
public final void setDaemon(boolean on)
2. 线程生命周期
分为JDK1.5之前和之后,从5种方法变为6种方法
3. 释放锁操作和死锁
(1)释放锁的操作
当前线程的同步方法、同步代码块执行结束
当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致当前线程异常结束
当前线程在同步代码块、同步方法中执行了锁对象的wat()方法,当前线程被挂起,并释放锁
(2)不会释放锁的操作
线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)。应尽量避免使用suspend()和resume()这样的过时来控制线程
(3)死锁
不同的线程分别锁住对方需要的同步监视器对象不释放,都在等待对方先放弃时就形成了线程的死锁。一旦出现死锁,整个程序既不会发生异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续
4. sleep()和wait()的区别
(1)sleep不释放锁,wait释放
(2)sleep指定休眠的时间,wait可以指定时间也可以无限等待直到notify或notifyAll
(3)sleep在Thread类中声明的静态方法,wait在Object中声明
因为调用wait方法是由锁对象调用,而锁对象类型是任意类型的对象,那么希望任意类型的对象都要有的方法,只能声明在Object类中
【基础API及常见算法】
1. Math类API
(1)java.lang.Math
Math.ceil():向上取整
Math.floor():向下取整
Math.round:四舍五入
Math.pow(a,b):a的b次幂
Math.sqrt():开方
Math.random():[0,1)的随机值
Math.PI:圆周率
Math.max(a,b):返回最大值
Math.min(a,b):返回最小值
java.lang.Math包的类/接口不用Import导包,其他包的类使用需要导包
(2)java.math
①BigInteger
大整数
BigInteger b1 = new BigInteger("165848648464648946161");
BigInteger b2 = new BigInteger("165848648464648946161");
//计算要调方法
b1.add(b2);
b1.subtract(b2);
b1.multiply(b2);
b1.divide(b2);
b1.remainder(b2);
②RoundingMode枚举类
CEILING:向正无穷方向的舍入模式
DOWN:向零舍入的舍入模式
FLOOR:向负无穷舍入
HALF_DOWN;向最接近数字舍入,如果距离相等,向下舍入
HALF_EVEN:向最接近数字舍入,如果距离相等,向相邻的偶数舍入
HALF_UP:向最接近数字方向的舍入模式,如果与两个相邻数字距离相等,向上舍入
UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
UP:远离零方向舍入
③BigDecimal
希望比float和double更精确的,使用BigDecimal
BigDecimal a1 = new BigDecimal("464.464987876546878765431346");
算术操作和BigInteger一样
但是注意如果两个小数相除除不尽,会报异常
处理为保留n位小数,保留格式为RoundingMode里的模式
如:
a1.divide(a2,20,CEILING);
(3)java.util.Random类
Random rand = new Random();
rand.nextInt();
rand.nextInt(10) //输出[0,10)的数,括号内的为边界
rand.nextDouble();
rand.nextBoolean();