多线程细节讲解
一、终止线程的四种方式
1、正常运行结束
2、使用退出标志退出线程
一般run方法执行完,线程应该正常结束,但是常常有些线程是伺服线程(即只有获得某种信号,才会停止的线程)最常见的就是在while循环当中的线程,设置一个boolean类型的标志,来退出循环。
之所以使用volatile关键字,是为了是exit同步。
3、interrupt方法结束线程
线程处于阻塞状态,调用interrupt方法,捕获异常,利用break跳出循环,才能结束线程
线程处于非阻塞状态。使用isInterrupted判断线程的中断标志退出循环。
4、stop方法终止线程(线程不安全)
程序中可以直接使用thread.stop来强行终止线程,但是这种方法是非常危险的,就像突然关闭计算机电源。一旦调用stop方法,线程会释放所持有的所有锁。这个时候数据是不受保护的,其他线程进来很可能会触发一些奇怪的错误。
三、sleep和wait区别
首先sleep属于Thread类,wait方法属于Object类
sleep方法导致程序暂停执行指定的时间,让出CPU给其他线程,但是他的监控状态依然保持着,当指定时间到了又会自动回复运行状态。
sleep不会释放对象锁,wait会释放对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify方法后本线程才会进入对象锁定池准备获取对象锁进入运行状态。
四、start和run区别
start方法启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码。‘
start方法启动线程,是处于就绪状态,并没有运行
run方法称为线程体,包含了线程要执行的内容,线程进入运行状态,运行run函数当中的代码。run方法运行结束,线程终止。然后CPU再调度其他线程。
五、java后台线程
定义:守护线程————“服务线程”,他是后台线程,有一个特性,即为用户线程提供公共服务,在没有用户线程可服务时会自动离开。
优先级:优先级比较低,用于为系统中的其他对象和线程提供服务。
设置:通过setDaemon(ture)来设置线程为守护线程。讲一个用户线程变为守护线程的方法就是在创建对象前,调用对象的setDaemon方法。
在Daemon中产生的新线程也是Daemon的。
线程则是JVM级别的,在web应用中使用的线程,在web应用停止后,依然是活跃的。
垃圾回收线程就是一个典型的守护线程。当程序中不再有任何运行的线程,就不会再产生垃圾,垃圾回收器也就无事可做,垃圾回收器就会自动离开。
生命周期:守护线程独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事情。也就是说守护线程不依赖于终端,但是依赖于系统,与系统同生共死。当jvm中都是守护线程的时候,jvm就可以推出了。