包装器的缓存:Boolean(全) Byte(全)
Character(0<=127) Short(-128~127) Long(-128~127)Integer(-128~127)
Float(无) Double(无)
缓存的数据会被缓存进常量池中,导致相同的值的包装类地址相同
自动装箱:value of() 自动拆箱:XXvalue()
int i=Integer.parseInt("123");// String->int
Integer i=new Integer(100); Integer i=Integer.valueOf(100);//int->Integer
int i=a.intValue();//Integer->int
继承关系
CPU:中央处理器,负责数据计算、执行指令集、存储介质间数据转移等
CPU线程:厂商规定的单位,一般表示虚拟核心状态下可并行的最大值
分时操作系统:给CPU分配任务并且控制CPU在规定时间内处理进程,超时释放进程的操作系统
CPU时间片:CPU处理进程的周期,时间到则释放,由操作系统控制
任务队列:操作系统将待处理的线程任务放到同一个队列中,参考用户标记的优先级决定队列的顺序将队列中的线程任务分配给CPU执行
进程:系统进行资源分配和调度的基本单位,是操作系统结构的基础
线程:是操作系统能够进行运算调度的最小单位,被包含于进程之中
并发:单核时期多任务解决方案,宏观上看起来多个任务“同时”执行
并行:多核心下,调用最多的算力,完成任务。多核心同时完成内容,可以各自完成互不影响
线程的生命周期:1.新建(创建Java线程对象)
2.就绪(将线程任务添加到任务队列)
3.运行(操作系统分配CPU执行线程任务)
4.阻塞[释放资源|不释放资源](CPU间争抢资源)
5.销毁(线程任务执行完,离开队列)
阻塞状态的原因:1.线程调用了阻塞式IO方法
2.线程调用了sleep()方法主动放弃占用的处理器资源
3.线程同步
4.线程调用wait()方法,等待某一通知
创建线程的4种途径:1.继承Thread类,重写run()方法,调用实例的start()方法
2.实现Runnable接口,重写run()方法,根据实例创建Thread对象,thread.start()开启 Runnable接口是函数式接口 支持使用方法引用以及lambda表达式
3.实现callable接口,重写call()方法,根据实例创建Future Task 对象start运行get结果 callable也是函数式接口
4.Executor.class
线程池的使用:
//1.创建线程池管理对象
ExecutorService e=Executors.newCachedThreadPool();
//2.创建Runnable或Callable实现类对象
Runnable r=new Runnable(){
public void run(){}
};
Callable c=new Callable(){
public Object call()throws Exception{}
};
//3.提交给线程池
e.excuter(r); Future f=e.submit();
//4.获取返回值
f.get();
f.get(3,TimeUnit.SECONDS);//线程超过3s结束线程
结束线程:强制结束 Thread.stop();
自结束 预留一个变量存储线程的运行状态
public static volatile boolean kaiguan=true;//使用volatile关键字,使变量不被缓存或输出语句 解决死亡列车问题
void:interrupt()中断标记 static boolean:interrupted()返回是否有中断,并且清除标记
boolean:isInterrupted() 返回是否有中断