关于线程/多线程(1)
什么是线程/多线程
首先我们要明白在操作系统中的多任务:在同一刻运行多个程序的能力。至于怎么实现的主要是操作系统将CPU的时间片分配给每一个进程,给人以并行处理的感觉
那么我们的多线程程序就是在较低层次上扩展了多任务的概念:一个程序同时执行多个任务,每一个任务称为一个线程。
那么多线程和多进程的区别在哪呢?本质区别在于每个进程拥有自己的一套变量,而线程则是共享数据。
中断线程
在早期的java版本中,有一个stop方法,其他方法可以调用它以终止线程,但是这个方法已经弃用了。(主要是由于stop的不安全性,你无法知道什么时候调用stop是安全的,什么时候不会对对象造成破坏。)
所以在现在没有可以强制终止线程的方法,但是可以用interrupt方法来请求终止线程。当调用interrupt方法时,该个线程的boolean标志也就是中断状态应该被置位,而每个线程都应该时不时检查这个标志,以判断自己是否被中断。
当然,如果线程被阻塞,就无法检测中断状态,就会抛出InterruptedException异常。
线程状态
线程有一下6种状态:
- New(新创建)
- Runnable(可运行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(被终止)
新创建线程
如 new Thread(r),此时线程还没有开始运行,这意味着它的状态还是new。
可运行线程
如 r.start ,此时此案城处于runnable状态,一个可运行的线程可能在运行也可能没在运行。比如说在时间片用完之后,操作系统剥夺了该线程的运行权,并给另一个线程时间片来执行任务,这个时候该线程虽然处于runnable状态但是并没有运行。
被阻塞和等待线程
当线程处于这两个状态时,它暂时不活动。它不运行任何代码且消耗最少的资源直到进程调度器重新激活它。下面讨论一下是怎样达到这个状态的。
- 当一个线程试图获取一个内部对象的对象锁时,该锁被其他线程持有,则进入阻塞状态。
- 当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。在调用Object.wait方法或Thread.join方法时就会出现这种情况
- 有几个方法有一个超时参数。调用他们导致线程进入计时等待状态。如Thread.sleep、Object.wait、Thread.join、Lock.tryLock以及Condition.awaitd的计时版
线程死亡
- 因为run方法正常退出而死亡。
- 因为一个没有捕获的异常终止了run方法而意外死亡。
线程优先级
在默认情况下,一个线程继承它的父线程的优先级,也可以使用setPriority方法提高或者降低任何一个线程的优先级。优先级必须在MIN_PRIORITY(1)和MAX_PRIORITY(10)之间的任何值。NORM_PRIORITY被定义为5.
当线程调度器选择新线程时,它首先选择具有较高优先级的线程,但是,线程的优先级是高度依赖于系统的,也就是说java线程的优先级映射在宿主主机平台的优先级上时,优先级可能更多,可能更少。
例如:Windows有7个优先级,而在Oracle为Linux提供的java虚拟机中,线程的优先级被忽略——所有线程具有相同的优先级。