线程状态
不要调用Thread类或Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start方法。这个方法将创建一个执行run方法的新线程

一、新创建线程
当用new操作符创建一个新线程时,如new Thread(r),该线程还没有开始运行。这意味着它的状态是new。
二、可运行线程
一旦调用start方法,线程处于runnable状态。一个可运行的线程可能正在运行,也可能没有运行,这取决于操作系统给线程提供运行的时间。
三、被阻塞的线程和等待线程
1)阻塞。当一个线程视图获取一个内部的对象锁 synchronized。而该锁被其他线程持有,则该线程进入阻塞状态。①当所有其他线程释放该锁,②并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。
2)等待。当线程等待另一个线程通知调度器一个条件时,他自己进入等待状态。在调用Object.wait方法或Thread.join方法,或者是等待java.util.concurrent库中的Lock或Condition时,就会出现这种情况。实际上,被阻塞与等待状态是很大不同的
3)计时等待。有几个方法有一个超时参数。调用它们导致线程进入计时等待专题。这一状态将保持到超市期满或者接收到适当的通知。带有超时参数的方法有Thread.sleep和Obejct.wait、Thread.join、Lock.tryLock以及Condition.await的计时版
1.sleep:Thread类的方法,必须带一个时间参数。会让当前线程休眠进入阻塞状态并释放CPU,提供其他线程运行的机会且不考虑优先级,但如果有同步锁则sleep不会释放锁即其他线程无法获得同步锁
2.yield:Thread类的方法,类似sleep但无法指定时间并且只会提供相同或更高优先级的线程运行的机会,不推荐使用
3.wait:Object类的方法,必须放在循环体和同步代码块中,执行该方法的线程会释放锁,进入线程等待池中等待被再次唤醒(notify随机唤醒,notifyAll全部唤醒,线程结束自动唤醒)即放入锁池中竞争同步锁
4.join:一种特殊的wait,当前运行线程调用另一个线程的join方法,当前线程进入阻塞状态直到另一个线程运行结束
四、被终止的线程
线程因如下两个原因之一被终止:
1)因为run方法正在退出而自然死亡
2)因为一个没有捕获的异常终止了run方法而意外死亡

浙公网安备 33010602011771号