java多线程--线程休眠

1. sleep()介绍

sleep() 定义在Thread.java中。

sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

2. sleep()示例

下面通过一个简单示例演示sleep()的用法。

 1 // SleepTest.java的源码
 2 class ThreadA extends Thread{
 3     public ThreadA(String name){
 4         super(name);
 5     }
 6     public synchronized void run() {
 7         try {
 8             for(int i=0; i <10; i++){
 9                 System.out.printf("%s: %d\n", this.getName(), i);
10                 // i能被4整除时,休眠100毫秒
11                 if (i%4 == 0)
12                     Thread.sleep(100);
13             }
14         } catch (InterruptedException e) {
15             e.printStackTrace();
16         }
17     }
18 }
19
20 public class SleepTest{
21     public static void main(String[] args){
22         ThreadA t1 = new ThreadA("t1");
23         t1.start();
24     }
25 } 

运行结果

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9

结果说明

程序比较简单,在主线程main中启动线程t1。t1启动之后,当t1中的计算i能被4整除时,t1会通过Thread.sleep(100)休眠100毫秒。

3. sleep() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。

但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。

下面通过示例演示sleep()是不会释放锁的。

 1 // SleepLockTest.java的源码
 2 public class SleepLockTest{
 3
 4     private static Object obj = new Object();
 5
 6     public static void main(String[] args){
 7         ThreadA t1 = new ThreadA("t1");
 8         ThreadA t2 = new ThreadA("t2");
 9         t1.start();
10         t2.start();
11     }
12
13     static class ThreadA extends Thread{
14         public ThreadA(String name){
15             super(name);
16         }
17         public void run(){
18             // 获取obj对象的同步锁
19             synchronized (obj) {
20                 try {
21                     for(int i=0; i <10; i++){
22                         System.out.printf("%s: %d\n", this.getName(), i);
23                         // i能被4整除时,休眠100毫秒
24                         if (i%4 == 0)
25                             Thread.sleep(100);
26                     }
27                 } catch (InterruptedException e) {
28                     e.printStackTrace();
29                 }
30             }
31         }
32     }
33 } 

运行结果

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
t2: 0
t2: 1
t2: 2
t2: 3
t2: 4
t2: 5
t2: 6
t2: 7
t2: 8
t2: 9

结果说明

主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.sleep(100);但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!

注意,若我们注释掉synchronized (obj)后再次执行该程序,t1和t2是可以相互切换的。

时间: 2024-11-08 00:52:28

java多线程--线程休眠的相关文章

java 多线程—— 线程等待与唤醒

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 wait(), notify(), notifyAll()等方法介绍 第2部分 wait()和notify()示例 第3部分 wait(long timeout)和notify() 第4部分 wait() 和 notifyAll() 第5部分 

java 多线程—— 线程让步

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 java 多线程—— 线程让步 概述 第1 部分 yield()介绍 第2 部分 yield()示例 第3 部分 yield() 与 wait()的比较 第1 部分 yield()介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”

Java多线程——线程之间的同步

Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,以及如何使用synchronized关键字和volatile关键字. 部分内容来自以下博客: https://www.cnblogs.com/hapjin/p/5492880.html https://www.cnblogs.com/paddix/p/5367116.html https://www.cnblogs.com/paddix/p/5428507.html https://www.cnblogs.com/liu

Java多线程程序休眠、暂停与停止

休眠 ??在Java多线程中,可以使用sleep()方法在指定毫秒数内让当前正在执行的线程休眠.??下面这段代码,使得主函数的main线程休眠了2000ms,最后输出的间隔时间也是2000ms. public class MyThread extends Thread { public static void main(String[] args) { try { long begin; long end; begin = System.currentTimeMillis(); System.o

Java多线程——线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java多线程——线程阻塞工具类LockSupport

简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞. 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执行的情况. 和 Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 InterruptedException 异常. LockSupport 的静态方法 park()可以阻塞当前线程,类似的还有 parkNanos().parkUntil()等方法.它们实现了一个限时等待,如下图

Java多线程-线程控制

 休眠线程: public static void sleep(long millis) throws InterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行).该线程不丢失任何监视器的所属权. 线程加入 public final void join() throws InterruptedException等待该线程终止. 抛出:InterruptedException - 如果另一个线程中断了当前线程.当抛出该异常时,当前线程的中断状态 被清除.  线程礼

JAVA多线程--线程的同步安全

每当我们在项目中使用多线程的时候,我们就不得不考虑线程的安全问题,而与线程安全直接挂钩的就是线程的同步问题.而在java的多线程中,用来保证多线程的同步安全性的主要有三种方法:同步代码块,同步方法和同步锁.下面就一起来看: 一.引言 最经典的线程问题:去银行存钱和取钱的问题,现在又甲乙两个人去同一个账户中取款,每人取出800,但是账户中一共有1000元,从逻辑上来讲,如果甲取走800,那么乙一定取不出来800: 1 package thread.threadInBank; 2 3 /** 4 *

java 多线程—线程怎么来的

并发处理的广泛应用是使得amdah1定律代替摩尔定律成为计算机性能发展源动力的根本原因,是人类压榨计算机运算能力的最有力武器. 并发并非一定得用多线程,多进程也可以,不过java里面谈论并发,大多数与线程脱不开关系. 1.线程的实现 线程是比进程更轻量级的调度执行单位,在linux里面,线程和进程没有什么区别,唯一的就是在地址空间,线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的. 目前主流的操作系统都提供的线程实现,java则提供的线程实现方法都是native的,因为不同的硬件和操作系