当前课程知识点:JAVA程序设计进阶 > 第一章 线程(上) > 1.3 线程的休眠 > Video
这一节我们将介绍线程的休眠
线程在运行过程当中
会调用sleep方法
来让自己休眠一段时间
那它为什么要这么做呢
那我们再把这个程序
做一点小改动
看看会有什么样的效果
我们希望说
延长主线程的执行时间
那怎么延长呢
我们可以在这个新线程的
start语句后面
加上一个让当前线程
指的就是main主线程
休眠一毫秒
我们加上个语句
大家看看这个语句
就是在我们这个程序的
倒数第四行 try
然后Thread.sleep1
那这个1指的是1毫秒
那就让当前这个线程
也就是主线程休眠一毫秒
然后在catch Exception
然后最后打印出来
main thread ends
那我们这个当前线程
自己主动休眠一毫秒
那它的效果会怎么样呢
这时候CPU就会去
提交给我们的新线程
让我们的新线程
得到执行的机会
然后新线程执行完了以后
那我们的主线程
经过休眠一毫秒醒过来以后
那就我们的线程调度去
再继续让我们的主线程去执行
我们可以看看这个执行后的效果
大家看看这个结果第一行
main thread starts
说主线程启动了
紧接着是new thread stared
新的线程也启动了
紧接着它计算出它的结果
然后说new thread ends
新线程结束了
最后是main thread ends
那大家对比一下这个执行结果
和上一次执行的结果
有什么不同呢
不同之处就在于我们的主线程
不是立马一开始就结束
因为上次是在
main thread stared后面
紧跟着就main thread ends
而现在不是
而是由我们新的线程
好像是穿插到我们的主线程当中
主线程启动以后
我们新线程又执行
执行完结束后主线程才执行结束
那这就是我们修改后
大家能看到的这个效果
那也希望大家能够体会到
其实背后我们的线程调度器
是怎么在调度多个线程的执行的
那我们下面再看另外一个例子
我们多创建几个线程
看一看会有什么样的效果
我们下面打算创建3个新线程
每个线程它要随机休眠一段时间
我们取的这一段时间是0到6秒的
然后再运行结束
然后我们看看这个代码
public class
ThreadSleepTester
我们看主方法
主方法里面构造了三个线程
这个线程的类型是TestThread
我们构造了thread1
thread2 thread3
然后通过它的构造方法
分别取了名字
然后紧接着我们打印出来
Starting threads
也就是说我要启动各种线程了
我们看一下怎么启动呢
thread1.start
thread2.start
thread3.start
那调用三个start方法
就启动三个线程
那启动完了以后
我们紧着打印
System.out0println
Threads started main ends
也就是说所有线程都启动了
我们的主线程要结束了
那到底刚才创建的这三个线程
它执行什么功能呢
我们来看一看
class TestThread
extends Thread
继承自Thread这个类
然后里面有个私有的成员变量
sleepTime 也是休眠时间
好 我们再看看
这个类的构造方法
构造方法里面的
第一行是super name
那指的是调用(负)类的构造方法
而此时负类就是我们的Thread类
紧接着生成sleepTime的一个值
大家看这里生成的值
是用了一个(随机速)方法
Math.random
注意 Math.random
它产生的是一个0到1之间的
一个随机速
那我们再乘以6000
那就是相当于0到6000毫秒
也就是0到6秒之间
好 我们再看看我们的
线程的主方法
就是它的run方法
try System out println
打印出什么呢
getName就是我们线程的名字
然后说going to sleep for
这个线程打算休眠多长时间呢
打印出sleepTime
把这个休眠时间给打印出来
然后紧接着马上调用
Thread.sleep
然后括号就是休眠时间
那这个Thread.sleep
实际上指的是
调用我们当前的这个线程
那当前这个线程
那指的就是我们(英文)
这个类的对象
那后面有catch
各种(英文)
然后最后再打印出
getName加finished
指的就是说
我们这个线程执行结束了
那我们看看
其实这个(英文)Thread类
主要构成就是
休眠0到6秒之间
然后这个再打印出来
说我已经运行结束了
我们看一下运行结果
首先是主线程
就是主方法里面
打印出St学arting threads
然后打印完了以后
它紧接着就
Threads started main ends
也就是说主线程有结束了
那其实我们看到
主线程它所起到的作用就是
创建三个线程
然后自己执行就结束了
那这时候我们再看看
这三个线程的执行情况
thread1 going to sleep for3519
它要休眠3000多毫秒
thread2打算休眠1000多毫秒
然后thread3
打算休眠5000多毫秒
大家看到这个打印顺序
基本上就是在
我们的线程调度器调度的时候
是thread1先执行
thread2执行 thread3先执行
那我们看结束
是不是也是按照这个顺序呢
大家看到thread2 finished
第二个线程先结束了 为什么呢
大家看看它只是休眠1000多毫秒
那在这三个线程中
它是休眠时间最短的
所以它休眠结束了以后
它立马这个线程结束
紧接着thread1 finished
第一个线程结束了
因为第一个线程
要休眠的是3000多毫秒
然后再下面thread3结束了
那因为它休眠的时间是最长的
是5000多毫秒
所以它最后结束
所以从这个例子
大家可以看出来
我们线程启动是有顺序
但是最后结束时候的顺序
取决于它休眠的时间有多长
线程休眠的原因
就是要让其它线程
得到执行的机会
这一节的内容就介绍到这里
谢谢大家
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video