多线程基础

1、线程的生命周期

如图1-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所示


多线程基础
4-1

        当线程操作某个对象时

            (1)、从主内存中复制变量到工作内存中(read and load)

            (2)、执行代码,改变共享变量值(use and assign)

            (3)、用工作内存数据刷新主内存中相关数据(store and write)

        所以,单个线程与线程的工作内存之间有了相互隔离的效果,称之为可见性问题

        实现线程安全的三种方法

        1、多实例

        2、使用java.util.concurrent下的类库

        3、使用锁机制,synchronized、lock方式