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(秒),一般一秒就够用
目录
相关文章
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
1天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
19 4
|
3天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
4天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
19 4
|
4天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
24 3
|
5天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
17 1
|
6天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
10 2
|
7天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
Java
JAVA方法的定义
JAVA方法的定义
80 0
|
5月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
39 1