线程的 4 个主要周期状态为创建线程、可执行(Runnable)、非可执行、终止(Dead)。当实例化一个 Thread 并执行 start() 之后,线程进入 Runnable 状态并开始执行 run() 方法。虽然线程看起来像是同时执行,但事实上在同一时间点上,还是只有一个线程在动作,只是线程之间切换的动作很快,所以看起来像是同时执行。
线程尤其优先权,由 1 (Thread.MIN_PRIORITY)到 10 (Thread.MAX_PRIORITY),默认是 5 (Thread.NORM_PRIORITY)。可以使用 Thread 的 setPriority() 方法来设定线程的优先权,设定必须在 1 到 10 之间,否则会抛出 IllegalArgumentException。优先权高的线程会先被执行完毕,然后才会轮到优先权低的线程。如果优先权相同,则轮流执行(Round-Robin 方式)。
绝大多数的操作系统都支持 Timeslicing,简单地说就是操作系统会为每一个线程分配一小段 CPU 时间(Quantum),时间一到就换下一个线程,即使现有的线程还没有结束。对于不支持 Timeslicing 的操作系统,每一个线程必须完成后,才能轮到下一个线程。在这样的操作系统中,如果想要让目前线程礼让一下其他线程,让它们有机会获得执行权,可以调用线程执行的 yield() 方法。例如:
public class SomeClass { Thread thread = new Thread(new Runnable() { public void run() { while (true) { yield(); // 暂时让出执行权 } } }); thread.start(); }
yield() 方法让同样优先权的线程有被执行的机会,当线程执行 yield() 方法让出执行权时,它会再度加入线程的队列,等待再度取得执行权。对于支持 Timeslicing 的操作系统,不需要调用 yield() 方法,因为操作系统会自动分配时间给线程来轮流执行。
有几种状况会让线程进入 Not Runnable 状态(或是 blocked 状态):
当线程在 Not Runnable 状态时,表示有某些原因组织它执行(例如等待使用者的文字输入、倾听网络联机等),线程排班器将不分配执行时间给这个线程,直到以下的几个情况让线程回到 Runnable 状态:
最后,如果执行的工作完成(或发生异常)而离开 run() 方法,则线程执行完毕,进入 Dead 状态。可以使用 isAlive() 方法来测试线程是否存活。
这里举个简单的例子。当使用 Thread.sleep() 让线程暂停执行进入 Not Runnable 状态时,可以使用 interrupt() 让它离开 Not Runnable 状态,当使用 sleep() 暂时进入 Not Runnable 状态而interrupt() 时,会抛出 java.lang.InterruptedException 异常。示例如下:
package cn.sunzn.ithread; public class IThread { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { try { Thread.sleep(99999); } catch (InterruptedException e) { System.out.println("I'm interrupted!"); } } }); thread.start(); thread.interrupt(); } }
执行结果:
I'm interrupted!
当然如果要暂停线程,但暂停的时间未知,使用 sleep() 并不是一个好方法。可以使用 wait() 方法,然后让别的线程使用 notify() 或 notifyAll() 来通知 Not Runnable 的线程回到 Runnable 状态。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。