From:Java并发编程的艺术
- 目录
BiBi - 并发编程 -0- 开篇
BiBi - 并发编程 -1- 挑战
BiBi - 并发编程 -2- volatile
BiBi - 并发编程 -3- 锁
BiBi - 并发编程 -4- 原子操作
BiBi - 并发编程 -5- Java内存模型
BiBi - 并发编程 -6- final关键字
BiBi - 并发编程 -7- DCL
BiBi - 并发编程 -8- 线程
BiBi - 并发编程 -9- ReentrantLock
BiBi - 并发编程 -10- 队列同步器
BiBi - 并发编程 -11- 并发容器
BiBi - 并发编程 -12- Fork/Join框架
BiBi - 并发编程 -13- 并发工具类
BiBi - 并发编程 -14- 线程池
BiBi - 并发编程 -15- Executor框架
启动一个普通的Java程序所开启的线程
1)main线程,程序入口
2)Reference Handler - 清除引用的线程
3)Finalizer - 调用对象finalize方法的线程
4)Signal Dispatcher - 分发处理发送给JVM信号的线程
finalize()方法
finalize()方法 - 当对象覆盖finalize方法,并且还没有执行过,则会将其放入到F-Queue队列中,由一个低优先级线程执行该队列中对象的finalize方法调用,之后再由GC回收。可以在finalize()方法中对对象进行【复活】。
线程优先级的设置
设置线程优先级时,针对频繁阻塞【休眠或者I/O操作】的线程需要设置较高优先级;而针对偏重计算【需要较多CPU时间或者偏运算】的线程则设置较低的优先级,确保处理器不会被独占。即:需要I/O操作的优先级高,需要CPU运算的优先级低。
提示:线程的优先级不能作为程序正确性的依赖,因为不同的JVM以及不同的操作系统上都会有差异。有的操作系统甚至忽略线程优先级的设定。
Daemon线程
1)主要被用作程序中的后台调度。
2)当Java虚拟机中不存在非Daemon线程时,会自动终止所有Daemon线程。
3)Daemon线程中的finally块不一定会执行。
4) Daemon线程中开启的线程也是Daemon线程。因为:当前线程就是该线程的父线程,而该线程的daemon属性和priority属性默认为父线程的对应属性。
一个线程对象是由其parent线程进行空间分配,并且child线程继承了parent的daemon、priority、加载资源的contextClassLoader、ThreadLocal。
中断
1)其它线程通过调用该线程的interrupt()方法对其进行中断。
2)如果该线程已经结束,即使该线程被中断过,那么调用其interrupt()时返回false。
3)许多在声明抛出InterruptedException的方法,如:sleep,在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识清除。
4)中断状态是线程的一个标识位,可以用来取消或终止任务。终止时可以去清理资源。
@Override
public void run() {
while( ! Thread.currentThread().isInterrupted() ) { // 也可以自己定义一个flag
++i;
}
}
suspend stop resume弃用
suspend()调用后,线程不会释放已经占有的资源,如:锁。而是占有着资源进入睡眠状态,容易引起死锁。stop()方法在终结一个线程时不会保证线程的资源正常释放,导致程序可能工作在不确定状态。
join
thread.join() 和 thread.join(long millis)
当thread线程执行完毕或等待millis时间后,才会继续执行当前线程。
网友评论