Java多线程——线程的状态&休眠、礼让与插队(延时的意义与倒计时模拟)

线程的状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypRIxZ7K-1596357894343)(https://s1.ax1x.com/2020/08/02/aJBcMn.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvEWaEZG-1596357855628)(https://s1.ax1x.com/2020/08/02/aJyO6H.png)]

方法解析
setPriority(int newPriority)更改线程优先级
static void sleep(long millis)让指定线程休眠指定的毫秒数
void join()等待线程结束
static void yield()暂停当前正在执行的线程对象,并执行其他线程
void interrupt()中断线程(不推荐使用)
boolean isAlive()测试线程是否处于活动状态

让线程停止

package com.thread.demo;

/*
 * Stop
 * 1.建议让线程自己正常停止 --> 循环次数,不建议用死循环
 * 2.建议使用标志位 --->设置一个标志位
 * 3.不要使用stop或者destroy等过时的或者jdk不推荐使用的方法!!
 * */
public class Demo9 implements Runnable {
    private boolean flag = true;  // 定义一个标志位
    @Override
    public void run() {
        int i = 0;
        while (flag) {
            i++;
            System.out.println("子线程正在运行---->" + i);
        }
    }

    public void stop() { // 定义一个可以由外部控制让线程停止的方法
        this.flag = false;
    }

    public static void main(String[] args) {
        Demo9 demo9 = new Demo9();
        new Thread(demo9).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main线程-->" + i);
            if (i == 900) {
                demo9.stop(); 
                System.out.println("子线程该停止了!");
            }
        }
    }
}

让线程休眠

  1. sleep(时间)指定线程阻塞的毫秒数
  2. sleep存在InterruptedException异常
  3. sleep时间达到后线程进入就绪状态
  4. sleep可以模拟网络延时,倒计时等
  5. 每个对象都有一把锁,sleep不会释放锁
  • 模拟网络延时—放大问题的发生性

    package com.thread.demo;
    
    public class Demo10 implements Runnable {
        /*  买火车票问题
         * 多个线程操作同一个资源时,出现线程安全问题,发生数据紊乱
         * */
        private int ticketNums = 10;
    /*
    * 模拟网络延时,可以方法问题的发生性
    * */
        @Override
        public void run() {
            while (true) {
                if (ticketNums <= 0)
                {
                    break;
                }
                try {
                    Thread.sleep(200); // 模拟延时
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");
            }
        }
    
        public static void main(String[] args) {
    
            Demo10 demo10 = new Demo10();
    
            new Thread(demo10,"小明").start();
            new Thread(demo10,"小军").start();
            new Thread(demo10,"黄牛").start();
    
        }
    }
    
    
  • 模拟倒计时

package com.thread.demo;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo11 implements Runnable {

    /*
    * 模拟倒计时
    * */
    private int num = 10;
    @Override
    public void run()  {
        try {
            tenDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
//  模拟倒计时
    public void tenDown() throws InterruptedException {
        while (true){
            Thread.sleep(1000);
            if (num<=0)break;
            System.out.println(num--);
        }
    }

    public static void main(String[] args) throws InterruptedException {
//        Demo11 demo11 = new Demo11();
//        new Thread(demo11).start();
        Date time = new Date(); //获取当前时间
        while (true){//打印系统时间
            Thread.sleep(1000);
            System.out.println(new SimpleDateFormat("HH:mm:ss").format(time)); // 格式化输出
            time = new Date(); // 更新时间
        }
    }
}

线程礼让

  • 礼让线程,让当前正在执行的线程停止并进入就绪状态
  • 让CPU重新进行调度,有可能CPU任然调度该线程,看CPU心情。
package com.thread.demo;

public class Demo12 {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }
}

class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程正在执行");
        Thread.yield();  //线程礼让
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

join,等待线程停止(插队)

package com.thread.demo;

public class Demo13 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("我是VIP等我跑完你再跑-->" + i);
        }
    }

    /*
     * join方法 ,等待线程结束,理解为插队
     * */
    public static void main(String[] args) throws InterruptedException {
        Demo13 demo13 = new Demo13();
        Thread thread = new Thread(demo13);
        thread.start();
        for (int i = 0; i < 500; i++) {
            System.out.println("普通用户-->" + i);
            if (i == 200) thread.join();  //开始插队
        }
    }
}

线程状态。

线程可以处于以下状态之一:

  • NEW
    尚未启动的线程处于此状态。
  • RUNNABLE
    在Java虚拟机中执行的线程处于此状态。
  • BLOCKED
    被阻塞等待监视器锁定的线程处于此状态。
  • WAITING
    正在等待另一个线程执行特定动作的线程处于此状态。
  • TIMED_WAITING
    正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
  • TERMINATED
    已退出的线程处于此状态。

一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。

package com.thread.demo;

public class Demo14 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("-------------------------");
        });

        Thread.State state = thread.getState();
        System.out.println(state);  // NEW

        thread.start(); // 激活线程
        state = thread.getState(); // RUNNABLE
        System.out.println(state);

//        观察线程状态
        while (thread.getState()!=Thread.State.TERMINATED){
            Thread.sleep(1000);
            state = thread.getState(); // 更新线程状态
            System.out.println(state);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pointer-faker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值