一个多个线程在执行的java程序,只有当其全部的线程执行结束时(更具体的说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候),它才会结束运行。有时,你需要为了终止程序而结束一个线程,或者当程序的用户想要取消某个thread对象正在做的任务。
java提供中断机制来通知线程表明我们想要结束它。中断机制的特性是线程需要检查是否被中断,而且还可以决定是否响应结束的请求。所以,线程可以忽略中断请求并且继续运行。
在这个指南中, 我们将开发一个程序,它创建线程,然后在5秒之后,它会使用中断机制来强制结束线程。
<b>准备</b>
指南中的例子是使用eclipse ide 来实现的。如果你使用eclipse 或者其他的ide,例如netbeans, 打开并创建一个新的java项目。
怎么做呢<b>…</b>
按照这些步骤来实现下面的例子::
1. 创建一个名为primegenerator的类,扩展thread类。
<code>1</code>
<code>public</code> <code>class</code> <code>primegenerator</code><code>extends</code> <code>thread{</code>
2. 覆盖 run()方法,写一个无限循环的while循环。在循环里,我们将从1开始处理连续的数字。对于每个数字,如果它是质数,那么,我们就把它写入到操控台。
<code>@override</code>
<code>2</code>
<code>public</code> <code>void</code> <code>run() {</code>
<code>3</code>
<code> </code><code>long</code> <code>number=1l;</code>
<code>4</code>
<code> </code><code>while</code> <code>(</code><code>true</code><code>) {</code>
<code>5</code>
<code> </code><code>if</code> <code>(isprime(number)) {</code>
<code>6</code>
<code> </code><code>system.out.printf(</code><code>"number %d is prime"</code><code>,number);</code>
<code>7</code>
<code> </code><code>}</code>
3. 处理完一个数字, 调用isinterrupted()方法来检查线程是否被中断了。如果它返回值为真,就写一个信息并结束线程的运行。
<code>if</code> <code>(isinterrupted()) {</code>
<code> </code><code>system.out.printf(</code><code>"the prime generator has been interrupted"</code><code>);</code>
<code> </code><code>return</code><code>;</code>
<code>}</code>
<code>number++;</code>
4. 实现isprime()方法. 它返回 boolean 值表明接收到的数字是否是质数。
<code>01</code>
<code>private</code> <code>boolean</code> <code>isprime(</code><code>long</code> <code>number) {</code>
<code>02</code>
<code> </code><code>if</code> <code>(number <=</code><code>2</code><code>) {</code>
<code>03</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code>04</code>
<code> </code><code>}</code>
<code>05</code>
<code>06</code>
<code> </code><code>for</code> <code>(</code><code>long</code> <code>i=</code><code>2</code><code>; i<number; i++){</code>
<code>07</code>
<code> </code><code>if</code> <code>((number % i)==</code><code>0</code><code>) {</code>
<code>08</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code>09</code>
<code> </code><code>}</code>
<code>10</code>
<code>11</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code>12</code>
5. 现在, 实现一个名为main的类,包括实现main()方法来实现例子的mian类。
<code>public</code> <code>class</code> <code>main {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>
6. 创建并开始一个primegenerator类的对象。
<code>thread task=</code><code>new</code> <code>primegenerator();</code>
<code>task.start();</code>
7. 等待5秒,然后中断 primegenerator 方法。
<code>try</code> <code>{</code>
<code> </code><code>thread.sleep(</code><code>5000</code><code>);</code>
<code>}</code><code>catch</code> <code>(interruptedexception e) {</code>
<code> </code><code>e.printstacktrace();</code>
<code>task.interrupt();</code>
8. 运行并查看结果。
<b>它是如果工作的</b><b>…</b>
下面是以上例子的运行结果这截图。我们可以发现 primegenerator 线程是如何检测到它被中断了然后写了信息并结束运行的。 请看截图:

thread 类还有一个boolean类型的属性来表明线程是否被中断。当你调用线程的interrupt() 方法,就代表你把这个属性设置为 true。 而isinterrupted() 方法仅返回属性值。
<b>更多</b><b>…</b>
thread 类还有其他可以检查线程是否被中断的方法。例如,这个静态方法interrupted()能检查正在运行的线程是否被中断。
isinterrupted()和interrupted() 方法有着很重要的区别。
第一个不会改变interrupted属性值,但是第二个会设置成false。
interrupted() 方法是一个静态方法,建议使用isinterrupted()方法。
在之前提到的,线程是可以忽略中断指令的,但是并这不是我们所期望的行为。