中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。这是本文重点强调的用法。
一个线程通过调用对被中断线程的thread对象的interrupt()方法,发送中断信号。为了让中断机制正常工作,被中断的线程必须支持它自己的中断(即要自己处理中断)
线程如何支持自身的中断?这取决于它当前正在做什么。如果线程正在频繁调用会抛interruptedexception异常的方法,在捕获异常之后,它只是从run()方法中返回。例如,假设在sleepmessages的例子中,关键的消息循环在线程的runnable对象的run方法中,代码可能会被修改成下面这样以支持中断:
<code>01</code>
<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < importantinfo.length; i++) {</code>
<code>02</code>
<code> </code><code>// pause for 4 seconds</code>
<code>03</code>
<code> </code><code>try</code> <code>{</code>
<code>04</code>
<code> </code><code>thread.sleep(</code><code>4000</code><code>);</code>
<code>05</code>
<code> </code><code>} </code><code>catch</code> <code>(interruptedexception e) {</code>
<code>06</code>
<code> </code><code>// we've been interrupted: no more messages.</code>
<code>07</code>
<code> </code><code>return</code><code>;</code>
<code>08</code>
<code> </code><code>}</code>
<code>09</code>
<code> </code><code>// print a message</code>
<code>10</code>
<code> </code><code>system.out.println(importantinfo[i]);</code>
<code>11</code>
<code>}</code>
许多会抛interruptedexception异常的方法(如sleep()),被设计成接收到中断后取消它们当前的操作,并在立即返回。
如果一个线程长时间运行而不调用会抛interruptedexception异常的方法会怎样? 那它必须周期性地调用thread.interrupted()方法,该方法在接收到中断请求后返回true。例如:
<code>1</code>
<code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < inputs.length; i++) {</code>
<code>2</code>
<code> </code><code>heavycrunch(inputs[i]);</code>
<code>3</code>
<code> </code><code>if</code> <code>(thread.interrupted()) {</code>
<code>4</code>
<code> </code><code>// we've been interrupted: no more crunching.</code>
<code>5</code>
<code> </code><code>return</code><code>;</code>
<code>6</code>
<code> </code><code>}</code>
<code>7</code>
在这个简单的例子中,代码只是检测中断,并在收到中断后退出线程。在更复杂的应用中,抛出一个interruptedexception异常可能更有意义。
<code>if</code> <code>(thread.interrupted()){</code>
<code> </code><code>throw</code> <code>new</code> <code>interruptedexception();</code>
这使得中断处理代码能集中在catch语句中。
中断机制通过使用称为中断状态的内部标记来实现。调用thread.interrupt()设置这个标记。当线程通过调用静态方法thread.interrupted()检测中断时,中断状态会被清除。非静态的isinterrupted()方法被线程用来检测其他线程的中断状态,不改变中断状态标记。
按照惯例,任何通过抛出一个interruptedexception异常退出的方法,当抛该异常时会清除中断状态。不过,通过其他的线程调用interrupt()方法,中断状态总是有可能会立即被重新设置。