一、多线程(学好多线程需要长期实践开发的过程)
1、概述: 进程是操作系统进行资源分配和调度的基本单位
线程是CPU调度的基本单位
2、Java启动JVM会启动一个进程
包含一个main()主线程,和一个GC守护线程
3、一般线程里放的都是耗时操作
Android里耗时操作不可以放在主线程,必须在启一个线程
4、方式一:
继承Thread类,重写run()方法,创建对象,启动线程
5、方式二:
实现Runnable接口,实现run()方法,将该类的实例传递给Thread对象,
解决单继承的局限性,实现多线程之间的数据共享
6、线程的优先级只是CPU调度的一个参数,同时还有许多其他系统进程或线程在执行,
所以很多时候结果并不绝对,Android里也是,线程调度要参考很多因素
7、线程控制
sleep():线程睡眠
jion(): 线程加入,将某个线程或片段加入另一个线程的顺序执行
yield():线程礼让到就绪状态
setDaemon():设置为后台线程,也即守护线程,如果没有其他线程执行,
只有守护线程,虚拟机将退出
intterrupt():中断线程。仅仅是将该线程的interrupt标志置位;
在该线程内部检测是否被中断,如果该线程当前不在执行状态,
会收到一个InterruptedException异常,
则程序员可以在catch语句内处理异常使该线程退出
8、线程的生命周期
新建、就绪、运行、阻塞、死亡
9、线程同步
synchronized(this){}将代码块实现原子操作,this为同步锁
如果一个方法内的代码都需要同步,则可以将方法声明为synchronized.
但是线程同步很耗费系统资源
10、线程锁
interface Lock Lock实现提供了比使用synchronized方法和语句更广泛的锁定操作
ReentrantLock lock = new ReentrantLock()
11、死锁问题
有嵌套锁,两个以上的线程因为争夺资源相互等待的条件才能造成死锁
12、线程间通信(互斥、同步)
任何对象都可以充当锁,而锁可以作为线程间通信的信号量,
故Object类提供了等待唤醒机制的方法:
wait(): 锁对象.wait() 将线程放到锁的WaitSet中,等待唤醒
notify(): 锁对象.notify() 从WaitSet中随机唤醒一个线程
notifyAll():
13、线程状态之间的转换
14、线程组
Java中使用ThreadGroup来表示县城组,它可以对一批线程进行分类管理,
java运行程序直接对线程组进行管理和控制
从对线程的批量管理角度,比线程池更强大好用
15、线程池
JDK5之后开始支持线程池
线程池里的每一个线程代码结束后,并不会死亡,
而是再次回到线程池中成为空闲状态,等待下一次使用
优点:启动一个线程的成本是比较高的,因为它涉及到与操作系统进行交互,
这种情况下使用线程池可以更好的提高系统性能,尤其在当前程序需要
创建大量的生存周期很短的线程时,更应该考虑使用线程池。
ExecutorService mypool = Executors.newFixedThreadPool(100);
16、定时器Timer类
Timer类是一个应用十分广泛的线程工具
可用于调度多个定时任务以后台线程的方式来执行,
TimerTask类 和Timer类的使用
17、线程的正确终止方法
stop是错误的停止方法,它会使线程突然停止,来不及做任何处理工作,
对数据和业务都非常有害
正确的停止方法是设置退出标志 volatile关键字,可见性
volatile boolean keepRunning = true;
run(){
while(keepRunning){
do some thing;
}
}
线程.keepRunning = false;
18、线程安全的类
你会看到有很多类都将自己的某些方法声明为synchronized,表示它将自己的操作
方法声明为原子操作,也就是该类自己考虑了在多线程时的线程安全问题,使用者
将不需要再考虑,所以这种方式提供了友好的接口,
在自己的开发过程中,要不断的在实践中总结,也要多阅读很牛的项目的代码,
看人家的良好代码能够给自己很多有有意义的启发。
19、总结
20、扩展Java并发知识
1、Java Memory Mode
JMM描述了Java线程如何通过内存进行交互
happens-before(偏序关系)
synchronized, volatile & final
2、Lock & Condition类
Java锁机制和等待条件的高层实现
3、线程安全性
原子性与可见性 atomic
4、多线程编程常用的交互模型
生产者-消费者模型
读写锁模型
future模型
worker Thread模型
在Java并发实现中是有哪些类直接实现了这些模型可以供我们直接调用的