目前为止的Java线程状态
new ---> 新生状态
调用runnable接口的start方法 --> 就绪状态
cpu分配好时间片调度到了(无法人为干涉) ---> 运行状态
线程正常执行完毕、外部干涉(加入标识位--->开关) ---> 死亡状态
线程阻塞状态--->sleep
sleep的特点:
-
sleep(时间)指定当前线程阻塞的毫秒数(毫秒不是秒)--->休眠
-
sleep存在异常--->InterruptedException--->写线程体的时候run方法不能对外抛出异常
-
sleep时间达到后线程进入就绪状态--->阻塞后的线程都是进入就绪状态等待cpu重新调度
-
sleep可以模拟网络延时、倒计时等
-
买一个对象都有一个锁,sleep不会释放锁(不会释放资源,占有资源进行等待)
Sleep的使用
package iostudy.threadstate;
/**
* sleep线程暂停模拟网络延时,放大发生错误的可能性,后续要对错误进行解决(保证线程安全,数据准确)--->并发
* @since JDK 1.8
* @date 2021/6/5
* @author Lucifer
*/
public class BlockedSleepNo1 {
//主线程方法
public static void main(String[] args) {
/*一份资源*/
Web12307 web = new Web12307();
/*打印main方法*/
System.out.println(Thread.currentThread().getName());
//三个代理人
new Thread(web, "南博1").start(); //在构造器给标识,区分是哪一个代理人拿到的资源
new Thread(web, "南博2").start();
new Thread(web, "南博3").start();
}
//定义内部类
static class Web12307 implements Runnable{
//定义资源数
private int ticketNums = 99;
/*重写run方法*/
指定对象阻塞
package iostudy.threadstate;
/**
* sleep模拟等待时间--->拿着资源等待
* @since JDK 1.8
* @date 2021/6/5
* @author Lucifer
*/
public class BlockedSleepNo2 {
public static void main(String[] args) {
/*一份资源,两个代理人*/
Racer racer = new Racer();
/*两个代理人,共享资源*/
new Thread(racer, "tortoise").start();
new Thread(racer, "rabbit").start();
}
/**
* 模拟龟兔赛跑
* 1、实现类写具体的实现方法--->循环、判断
* 2、具体方法工具类写判断方法--->供线程调用
*
* @author Lucifer
* @date 2021/6/1
* @since JDK 1.8
*/
static class Racer implements Runnable {
/*
1、这是具体的实现类,里面定义了具体的属性
2、重写了Runnable里面的run方法,该方法定义了具体的实现方式
3、判断方法新写一个方法去调用
*/
private static String winner; //定义胜利者