线程的生命

线程核心思想

    (1)线程因创建而产生

    (2)线程因调度而运行

    (3)线程因撤销而消亡

线程所有状态

    (1)新建状态(new)

    (2)就绪状态(有执行资格,无执行权)

    (3)运行状态(有执行资格,有执行权)

    (4)阻塞状态(没有执行资格,无执行权)

    (5)线程死亡(Dead)

线程顺序

    (1)新建状态 ------ 执行start()方法 ------> 就绪状态 

    (2)就绪状态 ------ 抢到cpu执行权,被操作系统选中 ------>运行状态

             运行状态 ------ cpu执行权被其他线程剥夺,时间片用完 ------> 就绪状态

    (3)运行状态 ------ sleep()、wait()、I/O操作 ------> 阻塞状态

    (4)阻塞状态 ------ 睡眠结束、notify唤醒、I/O阻塞解除 ------> 就绪状态

    (5)线程死亡 ------ run()方法执行结束、run()方法抛出异常、stop()方法(不推荐) ------> 线程死亡

Thread常用方法

    (1)start();

                 功能:通过start()使得线程处于就绪状态,在获得CPU时间片后通过run()开始执行

    (2)yield();

                 功能:让当前线程从运行状态回到可运行状态(就绪状态)

                 目的:让相同优先级的线程之间能适当的进行轮转运行

                 问题:实际上并不能保证yield()达到让步目的,因为让步后可能还是被程序调动选中

                 注意:yield()可能会没有效果

    (3)sleep();

                 功能:方法的作用是在指定毫秒数内让当前正在执行的线程休眠(暂停执行)

                 原理:运行状态 ---- sleep() ----> 阻塞状态 ---- 睡眠结束 ----> 就绪状态

                 注意:sleep()方法可能会产生睡眠时间过长的异常需要try-catch

    (4)join();

                 功能:等待当前线程运行结束后再进行其他线程

                 原理:阻止调用此方法的线程进入等待状态,直到该线程运行结束

                 场景:在主线程中,让主线程等待其余线程运行结束后再运行

    (5)wait(); 和 notify();

                 功能:必须结对使用,wait()之后只有匹配到notify才会继续

                 原理:运行状态 ---- wait() ----> 阻塞状态 ---- notify唤醒 ----> 就绪状态

    (4)实例分析

实例[1]-----关于yield的使用

  {T1线程 }

package com.experiment_2_Thread.three;

public class T1  implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 1; i < 10001; i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
}

 {Test1}

package com.experiment_2_Thread.three;

public class Test1 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     T1 t=new T1();
     Thread t1=new Thread(t,"测试1");
     t1.start();
     Thread t2=new Thread(t,"测试2");
     t2.start();
     t1.yield(); //t1线程让出cpu一次
	}
}

实例[2]-----关于睡眠方法的使用

  {T2线程}

package com.experiment_2_Thread.three;

public class T2  implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		//currentTimeMillis()将系统时间转换成毫秒值

		Long s=System.currentTimeMillis();
		System.out.println("开始了");
		try {
			//睡眠操作可能会出现长时间等待异常
			//2000毫秒 == 2 秒
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("结束了");
		System.out.println("用时毫秒"+(System.currentTimeMillis()-s));
		
	}

}

 {Test2}

package com.experiment_2_Thread.three;

public class Test2 {
    public static void main(String[] args) {
        T2 t2 = new T2();
        Thread thread = new Thread(t2);
        thread.start();
    }
}

实例[3]-----关于join()方法的使用

  {T3线程}

package com.experiment_2_Thread.three;

public class T3 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 1; i < 100; i++) {
			System.out.println(i);
		}
	}

}

  {Test3}

package com.experiment_2_Thread.three;

public class Test3 {

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
        T3 t3=new T3();
        Thread thread=new Thread(t3,"测试");
        thread.start();
        thread.join();//必须等到t3线程运行完才能进行主线程
        System.out.println("main线程结束了");
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值