常量池:
1:常量:
final修饰的成员变量表示常量,值一旦给定就无法改变
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量
2:静态常量池和运行时常量池:
静态常量池:即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
运行时常量池:则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
优点:
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。
线程池:
java提供的四种线程池:
1. newSingleThreadExecutor:
创建一个单线程的线程池。这个线程池只有一个线程在工作。一个线程池中只能跑一个线程,单线程串行执行任务,但一个任务完成后才能进行下一个任务。
2.newFixedThreadPool:
可以规定线程池的大小,小于这个数量就创建新线程。当达到这个数量,就只能有这些线程,别的任务等待运行的任务结束再使用线程。
3. newCachedThreadPool(推荐用这个):
线程池的大小是根据jvm的大小而定的。当线程池的大小(核心线程池大小就是创建线程池的时候默认创建几个线程)大于正在执行的任务的数量的时候,会去自动释放那些空闲的线程,当任务增加,回去新添加线程。
4.newScheduledThreadPool:
支持任务调度的线程池。
优点:
可以并行的执行多个线程,提高效率。这里的提高效率,不是说提高系统的性能,而是每个线程都有相应的带宽,多线程就是充分利用cpu资源。
一般功能较复杂(用户注册,其他的操作放到多线程中,不然用户体验很不好)或者需要轮询操作的方法用到多线程。
多线程:
一:继承Thread类:
启动:
1:重写run方法,run方法的方法体表示线程要执行的操作
2:创建Thread类的实例
3:通过调用线程对象的start方法来启动线程
currentThread:Thread类的静态方法,返回当前正在执行的线程对象
getName:Thread类的实例方法,返回当前线程的名称。
(用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例)
二:实现Runnable接口:
1:重新Runnable接口的run方法
2:创建Runnable接口实现类的对象
3:调用线程对象的statrt方法
三:实现callable接口:
Runnable和Callable的区别
1:Runnable执行方法是run(),Callable是call()
2:实现Runnable接口的任务线程无返回值;实现Callable接口的任务线程能返回执行结果
3:call方法可以抛出异常,run方法若有异常只能在内部消化
多线程的生命周期:(启动线程用start方法,而不是run方法)
新建和就绪状态:(调用完Start方法就进入就绪状态)
运行和阻塞状态:
阻塞状态:
1:调用Sleep方法,主动放弃所占用的处理器资源。
2:调用一个阻塞式I/O方法,在方法返回前,线程处于阻塞状态。
3:线程在等待一个通知
4:程序调用线程时的suspend方法,将线程挂起(但是容易造成死锁)
解除阻塞状态:
1:sleep方法过了指定时间
2:线程调用的I/O方法已返回
3:线程接收到通知
4:对挂起状态的线程调用resume恢复方法。
线程死亡:
run或call方法执行完成,线程结束
线程抛出一个为捕获的异常
直接调用该线程的Stop方法结束线程(容易死锁,不推荐)
(不用对一个死亡的线程使用start方法,使它重新启动)
IsAlive:
就绪,运行,阻塞: | True |
新建,死亡: | Flase |
Join:让一个线程等待另一个线程完成的方法。
守护线程:Gc处理机制:所以前台线程死亡,后台线程自动死亡
Thread的静态类:
线程睡眠:sleep:进入阻塞状态,睡眠时间内,不会获得执行的机会,可以用来暂停线程
线程让步:YieId:进入就绪状态,让政治执行的线程暂停,让它不会阻塞线程。
(调用YieId方法暂停后,只有优先级与当前线程相同或者更高的处于就绪状态的线程会获得执行的机会)
join和YieId的区别:
Sleep() | YieId() |
sleep暂停当前线程后,后给其他线程执行机会,不理会线程优先级 | YieId只会让优先级相同或更高的获得执行机会
|
sleep会将线程转入阻塞状态,经过阻塞时间后进入就绪状态。
| Yie会强制当前线程进入就绪状态,因此完全又可以让其他线程直接调用
|
sleep要么捕获异常,要么声明异常
| YieId则没有声明就抛出任何异常
|
可移植性高 | 可移植性比sleep低 |
同步锁(LOCK)
死锁:俩个线程相互等待对方同时释放同步监视器,就会发生死锁。
sleep:(不释放锁)
wait:(释放锁)当前线程等待,知道其他线程调用notify,notifyAll来唤醒
notify:获取单个线程
notifyAll:获取多个线程)