Java线程有6种状态:
新建状态 (NEW):创建了一个新的线程对象,并没有运行。
就绪状态 (RUNNABLE):可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行(运行状态),但它可能正在等待来自操作系统(如处理器)的其他资源(操作系统中的部分阻塞状态情况)。
阻塞状态 (BLOCKED):线程正在等待监视器锁,而陷入的状态。
等待状态 (WAITING):当前线程需要等待其他线程做出一些的特定的动作(通知或中断)。
超时等待状态 (TIMED_WAITING):区别于WAITING,它可以在指定的时间自行返回。
终止状态 (TERMINATED):线程执行完成。
Thread类常用方法
1.Thread.sleep():是Thread类中的静态方法,当一个执行中的线程调用了Thread的sleep()方法后,调用线程会暂时让出时间的执行权,转为Timed_Waiting状态,这期间不参与cpu的调度,但是该线程不释放已持有的锁。sleep时间到了,线程会转为就绪状态,然后参与cpu调度,获取到cpu资源之后就可以运行。
如果在睡眠期间,其他线程调用了该线程的interrupt()的方法中断了该线程,则该线程会抛出InterruptedException异常而返回。
2.Thread.yeild():使当前线程由执行状态,变成为就绪状态,主动让出CPU,在下一个线程执行时候,此线程有可能被执行,也有可能没有被执行,由任务调度器最终决定。
3.Thread.join(): 使当前线程等待某个线程完成,可以指定等待的时间。
4.Thread.interrupt:打断线程,如果被打断的线程正在执行Thread.sleep/join/wait方法,则会抛出InterruptedException,但被打断线程并不会终止运行;如果被打断的线程处于运行状态,则其打断标记会被置为True(可以通过isInterrupted()方法查看),之后有被打断线程自主决定是否终止运行。
打断标记为true时,会导致LockSupport.park()方法失效!
查看线程是否被打断过的方法的区别:
isInterrupted() | interrupted() |
---|---|
实例方法 | 静态方法 |
不会清除线程的打断标记 | 会清除现成的打断标记 |
本质是调用isInterrupted(false) | 本质是调用isInterrupted(true) |
5.Thread.start():内部会调用本地方法start0(),创建新的线程,并执行线程的run()方法。
6.Thread.run(): 会由主线程调用该线程的run()方法,不会创建新的线程。