本文共 3632 字,大约阅读时间需要 12 分钟。
就绪状态转换为运行状态:当此线程得到处理器资源;
运行状态转换为就绪状态:当此线程主动调用yield()方法或在运行过程中失去处理器资源。
运行状态转换为死亡状态:当此线程线程执行体执行完毕或发生了异常。
此处需要特别注意的是:当调用线程的yield()方法时,线程从运行状态转换为就绪状态,但接下来CPU调度就绪状态中的哪个线程具有一定的随机性,因此,可能会出现A线程调用了yield()方法后,接下来CPU仍然调度了A线程的情况。
由于实际的业务需要,常常会遇到需要在特定时机终止某一线程的运行,使其进入到死亡状态。目前最通用的做法是设置一boolean型的变量,当条件满足时,使线程执行体快速执行完毕。
(http://blog.csdn.net/jinhongliang123/article/details/7934678)
Wait sleep区别 1 wait时别的线程可以访问锁定对象 ------------------调用wait方法的时候必须锁定对象 2 sleep时别的线程也不可以访问锁定对象 第九章总结 1 线程/进程的概念 2 创建和启动线程的方式 3 sleep 4 join 5 yield 6 synchronized 7 wait 8 notify/notifyAll示例代码:(马士兵--线程)
/*范例名称: * 原文件名称: * 要点: * 1. 线程 */import java.util.*;//包含Date()public class ThreadTest { public static void main(String[] args) { /// //线程类_方法1 /// Runner1 r=new Runner1();//方法1 Thread t=new Thread(r); t.start();//启动线程 /// //线程类_方法2 /// Runner2 r2=new Runner2();//方法2 r2.start();//启动线程 for(int i=0;i<15;i++){ System.out.println("Main Thread: "+i); } /// //线程类_sleep方法 /// MyThread thread1=new MyThread("Hello thread"); thread1.start(); try{ Thread.sleep(5000);//主线程 休眠5s }catch (InterruptedException e) { return; } //thread1.interrupt();//打断线程 thread1.shutDown(); /// //线程同步 /// TestSync test=new TestSync(); Thread t1=new Thread(test); Thread t2=new Thread(test); t1.setName("T1"); t2.setName("T2"); t1.start();t2.start(); }}//线程类对象_方法1 (使用Runnable接口比从Thread类继承更灵活)class Runner1 implements Runnable{ //重写run方法 public void run() { for(int i=0;i<15;i++){ System.out.println("Runner1: "+i); } }}//线程类对象_方法2class Runner2 extends Thread{ //重写run方法 public void run() { for(int i=0;i<15;i++){ System.out.println("Runner2: "+i); } }}//线程类对象_方法2class MyThread extends Thread{ private boolean flag=true;//通过变量结束线程比较方便 public MyThread(String threadName) { super(threadName);//起名字 } public void run(){ while(flag){ System.out.println("I am "+getName()); System.out.println("==="+new Date()+"==="); try{ sleep(1000); }catch (InterruptedException e) { return; } } } public void shutDown(){ flag=false; }}/////线程同步class TestSync implements Runnable{ Timer timer=new Timer(); public void run(){ timer.add(Thread.currentThread().getName()); }}class Timer{ private static int num=0; public synchronized void add(String name){//锁定当前对象;互斥 //public void add(String name){//没有锁定 num++; try{Thread.sleep(100);} catch(InterruptedException e){} System.out.println(name+", 第"+num+"个使用timer的线程"); }}运行结果:
Runner1: 0Runner1: 1Runner1: 2Runner1: 3Runner1: 4Runner1: 5Runner1: 6Runner1: 7Runner1: 8Runner1: 9Runner1: 10Runner1: 11Runner1: 12Runner1: 13Runner1: 14Main Thread: 0Main Thread: 1Main Thread: 2Main Thread: 3Main Thread: 4Main Thread: 5Main Thread: 6Main Thread: 7Main Thread: 8Main Thread: 9Main Thread: 10Main Thread: 11Main Thread: 12Main Thread: 13Main Thread: 14Runner2: 0Runner2: 1Runner2: 2Runner2: 3Runner2: 4Runner2: 5Runner2: 6Runner2: 7Runner2: 8Runner2: 9Runner2: 10Runner2: 11Runner2: 12Runner2: 13Runner2: 14I am Hello thread===Sun Dec 18 17:01:35 CST 2016===I am Hello thread===Sun Dec 18 17:01:36 CST 2016===I am Hello thread===Sun Dec 18 17:01:37 CST 2016===I am Hello thread===Sun Dec 18 17:01:38 CST 2016===I am Hello thread===Sun Dec 18 17:01:39 CST 2016===T1, 第1个使用timer的线程T2, 第2个使用timer的线程