Java多线程系列--“基础篇”07之 线程休眠
概要
本章,会对Thread中sleep()方法进行介绍。涉及到的内容包括:
1. sleep()介绍
2. sleep()示例
3. sleep() 与 wait()的比较
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479256.html
1. sleep()介绍
sleep() 定义在Thread.java中。
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
2. sleep()示例
下面通过一个简单示例演示sleep()的用法。
- // SleepTest.java的源码
- class ThreadA extends Thread{
- public ThreadA(String name){
- super(name);
- }
- public synchronized void run() {
- try {
- for(int i=0; i <10; i++){
- System.out.printf("%s: %d\n", this.getName(), i);
- // i能被4整除时,休眠100毫秒
- if (i%4 == 0)
- Thread.sleep(100);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public class SleepTest{
- public static void main(String[] args){
- ThreadA t1 = new ThreadA("t1");
- t1.start();
- }
- }
运行结果:
- 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()是不会释放锁的。
- // SleepLockTest.java的源码
- public class SleepLockTest{
- private static Object obj = new Object();
- public static void main(String[] args){
- ThreadA t1 = new ThreadA("t1");
- ThreadA t2 = new ThreadA("t2");
- t1.start();
- t2.start();
- }
- static class ThreadA extends Thread{
- public ThreadA(String name){
- super(name);
- }
- public void run(){
- // 获取obj对象的同步锁
- synchronized (obj) {
- try {
- for(int i=0; i <10; i++){
- System.out.printf("%s: %d\n", this.getName(), i);
- // i能被4整除时,休眠100毫秒
- if (i%4 == 0)
- Thread.sleep(100);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
运行结果:
- 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是可以相互切换的。下面是注释调synchronized(obj) 之后的源码:
- // SleepLockTest.java的源码(注释掉synchronized(obj))
- public class SleepLockTest{
- private static Object obj = new Object();
- public static void main(String[] args){
- ThreadA t1 = new ThreadA("t1");
- ThreadA t2 = new ThreadA("t2");
- t1.start();
- t2.start();
- }
- static class ThreadA extends Thread{
- public ThreadA(String name){
- super(name);
- }
- public void run(){
- // 获取obj对象的同步锁
- // synchronized (obj) {
- try {
- for(int i=0; i <10; i++){
- System.out.printf("%s: %d\n", this.getName(), i);
- // i能被4整除时,休眠100毫秒
- if (i%4 == 0)
- Thread.sleep(100);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // }
- }
- }
- }
更多内容
3. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
4. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
5. Java多线程系列--“基础篇”04之 synchronized关键字
6. Java多线程系列--“基础篇”05之 线程等待与唤醒
Java多线程系列--“基础篇”07之 线程休眠的更多相关文章
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列 基础篇07 synchronized底层优化
转载 http://www.cnblogs.com/paddix/ 作者:liuxiaopeng http://www.infoq.com/cn/articles/java-se-16-synchro ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”08之 join()
概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
随机推荐
- XStream学习笔记
XStream 所需jar包: xstream-1.3.jar xpp3_min-1.1.4c.jar xmlpull-1.1.3.1.jar 目录: 1.注解去除,标签中带有包名的节点 2.注解修改 ...
- mysql获取所有分类的前n条记录的两种方法浅析
项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...
- mysql 基本操作语句
mysql 基本操作笔记: 创建表demo:CREATE TABLE `role` ( `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMME ...
- Windows下为MySQL做定时备份
第一种:新建批处理文件 backup.dat,里面输入以下代码: 代码如下 复制代码 net stop mysqlxcopy "C:/Program Files/MySQL/MySQL S ...
- springmvc和struts2的差别
springmvc和struts2的区别相关内容 1.spring mvc的入口是servlet,而struts2是filter filter功能:用户可以改变一个request和修改一个resp ...
- go json null字段的转换
最近试了试go中对json null字段进行转换,代码如下: struct 转 json: package main import ( "encoding/json" " ...
- 给 admin 新建的 hdfs 文件的权限
su hdfs hdfs dfs -chown -R admin / org.apache.hadoop.security.AccessControlException: Permission d ...
- 设计模式之美:Iterator(迭代器)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...
- 团队项目——站立会议DAY14
第十四次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:修改页面,查漏补缺.进行需求分析,监督每个组员,把大家的问题都一一梳理. 2.钟灵毓秀:继续修改模块代码 ...
- Host is not allowed to connect to this MySQL server 错误的处理方法
1. mysql>use mysql; mysql>update user set host = '%' where user = 'root'; mysql>select host ...