天天看点

线程管理(五)线程的睡眠和恢复

有时, 你会感兴趣在一段确定的时间内中断执行线程。例如, 程序的一个线程每分钟检查反应器状态。其余时间,线程什么也不做。在这段时间,线程不使用任何计算机资源。过了这段时间,当jvm选择它时,线程会准备好继续执行。为达此目的,你可以使用thread类的 sleep() 方法 。此方法接收一个整数作为参数,表示线程暂停运行的毫秒数。 在调用sleep() 方法后,当时间结束时,当jvm安排他们cpu时间,线程会继续按指令执行,

另一种可能是使用一个有timeunit列举元素的sleep() 方法,使用线程类的 sleep() 方法让当前线程睡眠,但是它接收的参数单位是表示并转换成毫秒的。

在这个指南中, 我们将开发一个程序使用sleep()方法来每秒写入真实的日期。

<b>准备</b>

指南中的例子是使用eclipse ide 来实现的。如果你使用eclipse 或者其他的ide,例如netbeans, 打开并创建一个新的java项目。

<b>怎么做呢</b><b>…</b>

按照这些步骤来实现下面的例子::

1.   创建一个类名为 fileclock,并一定实现runnable接口。

<code>1</code>

<code>public</code> <code>class</code> <code>fileclock </code><code>implements</code> <code>runnable {</code>

2.   实现  run() 方法。

<code>@override</code>

<code>2</code>

<code>public</code> <code>void</code> <code>run() {</code>

3.   写一个10次循环的环。在每次循环,创建一个date对象,写入文本并调用timeunit 类有seconds属性的sleep()方法来暂停线程1秒的运行。根据这个值,线程会停止将近一秒。当然 sleep() 方法 可以抛出一个 interruptedexception 异常,我们要加入捕捉代码。被中断时,解放或关闭正在使用的线程资源是好习惯。

<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; </code><code>10</code><code>; i++) {</code>

<code>  </code><code>system.out.printf(</code><code>"%s\n"</code><code>, </code><code>new</code> <code>date());</code>

<code>3</code>

<code>  </code><code>try</code> <code>{</code>

<code>4</code>

<code>      </code><code>timeunit.seconds.sleep(</code><code>1</code><code>);</code>

<code>5</code>

<code>  </code><code>} </code><code>catch</code> <code>(interruptedexception e) {</code>

<code>6</code>

<code>      </code><code>system.out.printf(</code><code>"the fileclock has been interrupted"</code><code>);</code>

<code>7</code>

<code>  </code><code>}</code>

<code>8</code>

<code>}</code>

<code>9</code>

4.   我们已经实现了线程。 现在,让我们来实现例子的主类吧。创建一个类名为 filemain ,包含 main() 方法。

<code>public</code> <code>class</code> <code>filemain {</code>

<code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

5.   创建fileclock类的对象并让一个线程执行它。然后,开始执行线程。

<code>fileclock clock=</code><code>new</code> <code>fileclock();</code>

<code>thread thread=</code><code>new</code> <code>thread(clock);</code>

<code>thread.start();</code>

6.   在主线程调用timeunit类有seconds属性的 sleep() 方法来等待5秒。

<code>try</code> <code>{</code>

<code>  </code><code>timeunit.seconds.sleep(</code><code>5</code><code>);</code>

<code>} </code><code>catch</code> <code>(interruptedexception e) {</code>

<code>  </code><code>e.printstacktrace();</code>

<code>};</code>

7.   中断 fileclock 线程。

<code>thread.interrupt();</code>

8.   运行例子并查看结果。

<b>它是怎么工作的</b><b>…</b>

当你运行这个例子,你可以发现程序是如何每秒写入一个date对象的,然后,有信息显示fileclock线程被中断。

当你调用sleep()方法, thread 离开cpu并在一段时间内停止运行。在这段时间内,它是不消耗cpu时间的,使用可以执行其他任务。

当 thread is是睡眠和中断的时候,那方法会立刻抛出interruptedexception异常并不会一直等到睡眠时间过去。

<b>更多</b><b>…</b>

java 并发 api 有另一种方法能让线程对象离开 cpu。它是 yield() 方法, 它向jvm表示线程对象可以让cpu执行其他任务。jvm 不保证它会遵守请求。通常,它只是用来试调的。

继续阅读