1、线程的生命周期
如图1-1
线程的生命周期一共有五个状态,new、runnable、running、blocked、dead
1、new:刚创建,并未运行的线程 处于not alive状态;
2、runnable:就绪状态,调用start()方法之后,等待cpu分配资源,在分配资源之前,线程不执行,但是处于alive状态;
3、running:运行状态,runnable状态的线程获取的cpu资源之后,进入运行状态;
4、blocked:堵塞状态,由于某种原因,导致线程让出cpu资源,暂定自己的执行,进入堵塞状态;
(1)、sleep():时间到之后可自动恢复到就绪状态;join(),把并行的方法转换为串行,前面线程执行完毕,后面线程恢复到就绪状态(其实join方法的原理就是调用了wait方法)
(2)、wait():调用notify()方法或者notifyAll()方法可以回到就绪状态
(3)、被另一个线程阻塞、调用suspend方法,可通过resume方法恢复
2、守护线程
简单理解为后台运行线程,进程结束,守护线程自然结束,线程对象中的daemon属性设置为true,则可设置为守护线程,比较经典的守护线程就是JVM中的垃圾回收,内存管理等,都是守护线程
3、线程中的异常处理
线程是独立执行的代码片段,线程的问题应该由线程自己来解决
出现checked Exception可直接通过try/catch进行处理
出现unchecked Exception,需要注册一个事件进行处理
4、线程安全
(1)、Java的内存模型,主要包含工作内存和主内存,主内存就是平时所说的堆内存,存放类实例,静态变量等,是多个线程共享的,正因为是多个线程共享的所以会出现线程安全问题,如图4-1所示
当线程操作某个对象时
(1)、从主内存中复制变量到工作内存中(read and load)
(2)、执行代码,改变共享变量值(use and assign)
(3)、用工作内存数据刷新主内存中相关数据(store and write)
所以,单个线程与线程的工作内存之间有了相互隔离的效果,称之为可见性问题
实现线程安全的三种方法
1、多实例
2、使用java.util.concurrent下的类库
3、使用锁机制,synchronized、lock方式