JAVA Thread类主要方法解读
JVM允许应用拥有多个线程并发执行。每个线程都有优先级(默认是5),优先级高的比优先级低的线程有优势。另外,每个线程可以标志为Daemon线程,或者非Daemon线程。在一个正在执行的线程中创建一个新的Thread对象,该对象与创建它的线程优先级初始化成一致。此外,Daemon的线程创建的Thread对象肯定是Daemon线程。JVM启动的时候,被执行main方法的类会被执行成一个非Daemon的线程。JVM会在以下两个条件下终止运行:
- 1.Runtime.getRuntime().exit()被执行,并且安全管理器已经允许exit操作生效;
- 2.所有的非Daemon线程都已经死亡,所有的线程要么从run方法返回,要么异常已经传递到run方法之外。
创建一个Thread对象的方法有两种:继承Thread类,或者实现Runnable接口。
1.构造函数
Thread() 可以指定的参数有:
ThreadGroup: 默认可以从当前现成的安全管理器中获取
Runnable: 需要执行run方法的对象
String: Thread的名称,可以重复
stackSize: 需要的栈长度,默认为0,即忽略该设置
AccessControlContext: 默认通过AccessController.getContext()获取,该参数并没有开放出来
2.线程状态 Thread.State
- NEW: 没有执行过的线程
- RUNNABLE: 正在执行的线程,该线程也许会因为等待期待资源在等待
- BLOCKED: 等待监视锁,进入synchronized代码块、方法;或者可以重入的synchronized代码块、方法,别的线程调用了Object.wait方法
- WAITING: 进入WAITING状态的几种情况
- 调用了没有设置timeOut的Object.wait
- 调用了没有设置timeOut的Thread.join
- 调用了没有设置timeOut的LockSupport.park
一个线程进入WAITING状态,是为了等待其他线程的一个特殊操作。比如一个调用了wait方法的线程,等待其他线程调用notify、notifyAll方法;或者,一个调用了Thread.join()等待一个特殊线程达到终止状态。
- TIMED_WAITING : 进入TIMED_WAITING状态的几种情况:
- 调用了Thread.sleep
- 调用了设置timeOut的Object.wait
- 调用了设置timeOut的Thread.join
- 调用了LockSupport.parkNanos
- 调用了LockSupport.parkUntil
- TERMINATED:线程完成执行了。
3.线程状态修改
- 3.1 中断线程
java中断原理 [http://www.infoq.com/cn/articles/java-interrupt-mechanism]
interrupt()
用于中断一个线程,线程自己可以中断自己,此外,如果checkAccess()
(该方法用于判断是否可以修改当前线程,一般同一个线程组下的线程可以互相修改) 方法没有通过,则会收到一个 SecurityException
。
- 调用wait()/wait(long)/wait(long, int),join ,sleep方法被阻塞,被中断时,中断状态被清空(设置为fale),并抛出一个
InterruptedException
; - 被I/O操作阻塞,并且是一个可中断的通道,被中断时该通道会被关闭,设置中断状态(设置为true),并抛出一个
ClosedByInterruptException
; - 被Selector阻塞的线程,被中断时立即返回(跟wakeup方法类似),并设置中断状态;
- 其他的情况,设置了中断状态。
中断一个不是alive的线程,没有任何作用。
如果一个线程已经运行,并且没有终止,则认为是Alive的。
interrupted()
测试当前线程是否已经被中断,并清空中断状态。
isInterrupted()
测试当前线程是否已经被中断,但是不设置任何中断状态。
3.2 暂停线程
yield
方法暗示调度器,当前线程愿意让出CPU资源,不过调度器可以随意的忽略该暗示。3.3 sleep
sleep
方法让当前线程休眠一定时间,但是不会放弃已经获取的锁。