Java线程方法-休眠(sleep)

简介: Java线程方法-休眠(sleep)

1 停止线程

注意:

1 不推荐使用jdk提供的stop(),destroy()方法(已废弃)


image.png

2 推荐线程自己停下来

3 建议使用一个标志位进行终止变量,当flag=false时,则终止线程运行


package com.wyh.thread;
/**
 * @program: Thread
 * @description: 利用flag让线程停止
 * @author: 魏一鹤
 * @createDate: 2022-01-01 22:38
 **/
//测试线程停止
// 注意点
// 1、建议线程正常停止---> 利用次数 不建议死循环(就算是死循环也要定义延时,不要跑的太快卡死cpu)
// 2. 建议使用标志位 --->  设置一个标志位
// 3. 不要使用stop或者destroy等过时或者jdk不建议使用的方法
public class TestThreadStop  implements  Runnable{
//1.定义一个标识符决定线程是否运行 true为运行 false为停止
    private boolean flag=true;
    @Override
public void run() {
int i=0;
// true为运行 false为停止
        while (flag){
            System.out.println("run....Thread"+i++);
        }
    }
//2.定义一个方法转换标识符停止线程
    public void stopThread() {
//false让线程停止
        this.flag=false;
    }
public static void main(String[] args){
//创建线程对象
        TestThreadStop testThreadStop = new TestThreadStop();
//开启线程
        new Thread(testThreadStop).start();
for (int i = 0; i < 1000; i++) {
//主线程跑的次数
            System.out.println("main:"+i);
if(i==900){
//线程运行900次让线程停止   调用stop方法切换标志位,让线程停止
                testThreadStop.stopThread();
                System.out.println("线程该停止了");
            }
        }
    }
}


image.png


2 线程休眠 sleep

  1. sleep(时间)指定当前线程阻塞的毫秒数(1000hs(毫秒)=1s(秒),一般一秒就够用)
  2. sleep存在异常interruptedException
  3. sleep时间达到后线程进入就绪状态
  4. sleep可以模拟网络延时,倒计时等
  5. 每一个对象都有一个锁,sleep不会释放锁(线程同步)

线程休眠的作用(模拟网络延时): 放大问题的发生性


买票


package com.wyh.thread;
/**
 * @program: Thread
 * @description: 线程休眠(阻塞) 模拟网络延时
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:13
 **/
//模拟网络延时
//作用    1 放大问题的发生性
public class TestThreadSleep implements Runnable {
    //票数
    int ticketNums=10;
    @Override
public void run() {
        //火车票抢票
        while (true) {
            //如果没票了就停止
            if(ticketNums<=0){
                break;
}
            //模拟延迟
            try {
                Thread.sleep(100);
} catch (InterruptedException e) {
                e.printStackTrace();
}
            //Thread.currentThread().getName() 获取当前线程名称 我们是可以给线程命名的
            System.out.println(Thread.currentThread().getName() + "-->抢到了"+ticketNums--+"张票");
}
    }
    public static void main(String[] args){
        //创建runnable接口的实现类对象
        TestThreadSleep testThreadSleep = new TestThreadSleep();
//3个线程一起去抢票
        new Thread(testThreadSleep,"魏一鹤").start();
new Thread(testThreadSleep,"魏一鸣").start();
new Thread(testThreadSleep,"黄牛党").start();
}
}

模拟倒计时

package com.wyh.thread;
/**
 * @program: Thread
 * @description: 模拟倒计时
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:22
 **/
public class TestThreadSleep2 {
//倒计数方法
    public static void TimeDown() throws InterruptedException {
//初始化秒数
        int timeNum=10;
while (true){
//线程休眠1s  1000ms=1s
            Thread.sleep(1000);
//自减
            System.out.println(timeNum--);
//倒到0时候停止
            if(timeNum==0){
                System.out.println("倒计时结束!");
break;
            }
        }
    }
public static void main(String[] args) throws InterruptedException {
TimeDown();
    }
}


每1s获取当前系统时间


package com.wyh.thread;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;
/**
 * @program: Thread
 * @description: 打印当前时间
 * @author: 魏一鹤
 * @createDate: 2022-01-02 20:32
 **/
public class TestThreadSleep3 {
//打印当前系统时间
    public static void main(String[] args) throws InterruptedException {
//获取当前系统时间
       Date date = new Date(System.currentTimeMillis());
while (true) {
          Thread.sleep(1000);
          System.out.println("当前时间:"+new SimpleDateFormat("HH:mm:ss").format(date));
//更新当前时间
          date=new Date(System.currentTimeMillis());
      }
    }
}


总结sleep的特点和作用

  1. 模拟网络延迟
  2. 倒计时
  3. sleep不会释放锁(线程同步)
  4. sleep存在异常interruptedException
  5. sleep时间达到后线程进入就绪状态
  6. sleep(时间)指定当前线程阻塞的毫秒数(1000hs(毫秒)=1s(秒),一般一秒就够用
目录
相关文章
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
106 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
269 83
|
30天前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
156 46
|
2月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
92 1
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
172 0
|
2月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
71 0
|
2月前
|
安全 Java
JAVA:Collections类的shuffle()方法
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的工具方法,适用于洗牌、抽奖等场景。该方法直接修改原列表,支持自定义随机数生成器以实现可重现的打乱顺序。使用时需注意其原地修改特性及非线程安全性。
68 0
|
2月前
|
算法 安全 Java
java中Collections.shuffle方法的功能说明
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,常用于洗牌、抽奖等场景。可选 `Random` 参数支持固定种子以实现可重复的随机顺序。方法直接修改原列表,无返回值。
55 0
|
2月前
|
Java 程序员 项目管理
Java 程序员不容错过的 Git Flow 全套学习资料及应用方法详解 Git Flow
本文详细介绍了Git Flow技术方案及其在Java项目中的应用实例,涵盖分支管理、版本发布与紧急修复流程,帮助开发者掌握高效的代码管理方法,提升团队协作效率。附示例操作及代码下载链接。
57 0
|
存储 安全 Java
深入理解Java并发编程:线程安全与锁机制
【5月更文挑战第31天】在Java并发编程中,线程安全和锁机制是两个核心概念。本文将深入探讨这两个概念,包括它们的定义、实现方式以及在实际开发中的应用。通过对线程安全和锁机制的深入理解,可以帮助我们更好地解决并发编程中的问题,提高程序的性能和稳定性。

热门文章

最新文章