13.1 多线程
线程就是进程的一条执行路径,一个进程可以有多条执行路径(即多线程)。
一个进程中至少有一条线程。
使用多线程是为了同时执行多部分代码,每一个线程都有各自的任务。
13.2 JVM中的多线程
JVM的启动就需要多条线程的支持。eg:主线程、垃圾回收线程。
System.gc(); 即垃圾回收器,但不一定马上执行。
Object类的fanalize()方法被回收器调用以释放空间。
13.3 多线程的创造方式1 --- 继承Thread类
1)集成Thread类
2)子类重写run()方法
3)实例化此类
4)启动线程 start()
13.4 Thread类常见方法
run(), start(), getName(), currentThread(). etc.
13.5 线程的状态
13.6 创建线程的方式2 --- 实现Runnable接口
Java不支持多继承,当一个类有父类时只能通过此方法。
Thread类实现了Runnable接口
接口中只有一个方法 run()
Thread t = new Thread (Runnable r)
使用时利用多态实例化线程。
Runnable的优点在于仅仅将线程任务进行对象的封装。
13.7 多线程安全问题
1)多个线程操作共享数据
2)操作共享数据的代码有多条
(当一个线程操作共享数据时,另一条线程参与了运算)
13.8 解决方法 同步代码块
synchronized (obj){
//code...
}
obj称作同步锁,或对象锁,可以为任一对象/类
线程进入同步语句时需要判断是否有线程正在运行
弊端:同步外的线程需要判断同步锁,相对降低了效率
前提:必须有多个线程并使用同一个锁
13.9 同步函数
synchronized用来修饰函数
同步函数使用的锁是this
同步代码块则可以指定任意同步锁
13.10 静态同步函数
静态方法中没有this只想,同步函数的同步锁为该函数所属字节码文件对象,可以使用getClass()获取,也可以用 Obj.class
13.11 死锁
多个线程操作多个锁,导致互相锁死。