一个程序同时执行多个任务,通常每个任务称为一个线程。
进程和线程区别:
进程拥有自己的一整套变量体系,而线程则是共享。线程是轻量的,创建撤销的开销小。
线程中断
线程终止只有两种方式:
1、run方法正常退出,自然死亡
2、因为有没有捕获的异常而终止run方法,意外死亡
stop 方法可以终止线程,但是被弃用了
当线程调用interrupt方法时,线程中断状态被置位;每个线程都有一个boolean标志,以判断线程是否被中断。
中断不等于终止,没有任务和语言上的要求,中断的线程应该终止。中断一个线程只不过是引起他的注意,被中断的线程可以决定如何响应中断。线程可以简单的将中断作为一个终止的请求。
线程属性
线程有很多属性,常常关心只有几种,线程优先级,守护线程,处理未捕获异常的处理器。
线程优先级,注意一点就行,程序功能的正确性不能依赖于优先级
守护线程:守护线程唯一的用途就是为其他线程服务,当只剩下守护线程的时候虚拟机就会退出,所以守护线程永远不要去访问资源,如文件,数据库,因为他可能在任何时候中断。函数void setDaemon(boolean isDaemon)
未捕获异常处理器:这是因为run方法不能抛出任何被检测的异常,但是被检测的异常被抛出就会终止线程;有几种方法处理,一是自己setUncaughtExceptionHandler;第二种是try catch
线程同步
线程同步方法主要有两种,一种是使用ReentrantLock类,和synchronized关键字
锁
1、锁是可重入的,比如A调用B,执行A需要锁s,执行B也需要锁s,那么获得锁s,执行A同时也可以执行B。
2、公平锁偏爱等待时间长的线程,但是效率不好,ReentrantLock是公平锁。
3、锁可以拥有多个条件状态
4、锁使得代码只能被一个线程执行