线程状态

不要调用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方法而意外死亡

posted @ 2018-05-20 21:29  snoopy666  阅读(100)  评论(0)    收藏  举报