java slepp_跟我学Java编程—sleep方法在线程同步中的具体应用场景

sleep方法是Thread类的一个静态方法,该方法可以把当前正在运行的线程挂起一段时间(时间值由参数传入),挂起时间到期后,JVM会在适当的时间再次唤醒该线程。

先看一个例子代码:

44df7c1fb346dc4deff5c535ad02f6a0.png

MyRunner类代码:

893404d697ab217ea7ce55a906a5b97e.png

在SleepDemo类主线程中,启动子线程后,应用Thread类的sleep方法将主线程挂起1000毫秒,因为sleep方法抛出InterruptedException异常,因此调用sleep方法时,需要包含在try-cahtch语句,用于捕获sleep方法可能抛出的异常;在MyRunner类子线程中,每次循环都会调用Thread类的sleep方法将子线程挂起500毫秒,然后再继续执行。程序输出结果如下图所示:

43847b2e8043dda7335151a24c0165a7.pngSleepDemo输出结果

从输出结果可以看出,主线程在子线程执行之前就被挂起,也验证了线程调用start方法后,JVM并没有直接启动子线程,而是在主线程执行完后再执行子线程的。子线程在执行过程中,每次循环都会等待0.5秒后再继续执行。

上面的例子代码让我们了解了sleep的具体用法,那么sleep方法的具体应用场景是什么?实际应用编程中,在什么情况下需要使用sleep方法呢?

考虑一个编程任务。要求模拟一个服务器端文档上传服务程序,10个用户并发上传不同格式的文档,该服务程序需要启动一个转换线程把用户上传的文档统一转换为PDF文档,转换完成后,需要将该文档存储路径设置到文档对象中,并输出该文档信息。另外,模拟程序不需要处理实际的文档,模拟处理过程即可。

既然是服务器端处理程序,需要采用多线程处理,对每个用户的上传请求创建一个线程A,在线程A中,考虑到文档格式转换操作时间较长,需要创建一个转换文档格式的线程B。程序处理框架如下图所示:

c40e34628c77c9ba43eff8bb6a8176f1.png文档上传服务程序处理过程

用户发出上传文档请求,主服务线程接收到请求后,创建一个处理该文档的A线程,A线程启动后,创建一个文档转换线程B,B线程负责文档格式的转换工作,A线程需要等待B线程完成文档转换工作后,存储并输出文档信息。上述过程涉及到A线程和B线程的同步,A线程创建B线程后,需要等待B线程完成工作,才能继续执行。此时,A线程就可以调用sleep方法休眠一段时间,等待B线程完成工作。

(1)首先建立Document类,该类有两个属性,分别是docName、savePath,savePath属性值的设置在B线程进行。代码如下:

9cb59e1e131dbf3a3683e41864bd12b6.png

(2)建立文档转换线程类(B线程),该类通过for循环模拟长时间处理操作,并设置传入doc对象的savePath属性,表示文档转换完成。代码如下:

0c02480573453136675f7f0d30924c72.png

(3)建立请求处理线程类(A线程),该类启动文档转换线程,并调用sleep方法自身休眠1000毫秒,等待文档转换工作的完成。

2883c8318e34fa99bf4e0a5d5df534c6.png

(4)建立主线程类,该类首先初始化文档列表,然后启动线程对每个文档进行处理。

cc2c126606b185d4935e01fdbd84e146.png

程序输出结果如下图所示:

686b9b48d040a5a0dc2185b308a93109.png文档处理程序输出结果

■ 知识点拨

当线程需要等待资源或者信号到达才能继续执行时,可以采用sleep方法让线程自身休眠等待资源和信号。当线程唤醒时,需要线程自身判断等待的资源是否满足或信号是否到达,当资源仍然不能满足或信号仍未到达时,需要提供一种持续等待的机制,直到资源满足或信号到达。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值