在前面的线程任务都连接着一个设定的Thread对象,和开启连接着thread。然而,这个Thread也提供着更多高级的任务,包括打断其它线程的执行、合并一个线程到另一个线程,和导致一个线程去休眠。
1.2.1打断线程(Interruption Threads)
这个Thread提供给每一个线程可以打断另一个线程的打断机制。当一个线程被打断,它将会抛出java.lang.InterruptedException的异常。这个机制包含了下面三个的方法:
(1) void interrupt():通过Thread的这个方法来打断一个线程。当一个线程因为请求Thread的sleep()或join()的方法而阻塞时,这个线程被打断将会抛出 InterruptedException。
(2) static boolean interrupted():测试当前的线程是否被打断,如果是将会返回true。线程是否被打断,通过这个方法是可以明确的。
(3) boolean isInterrupted():测试这个线程是否已经被打断,如果是将会返回true。这个线程的打断状态在这个方法是不被影响的。
我创建一个应用,这个应用是证明线程被打断的。看Listing1-2.
Listing1-2 证明线程打断。
package com.owen.thread.chapter1;
public class ThreadInterruption
{
public static void main(String[] args)
{
Runnable r = new Runnable()
{
@Override
public void run()
{
String name = Thread.currentThread().getName();
int count = 0;
while (!Thread.interrupted())
System.out.println(name + ": " + count++);
}
};
Thread thdA = new Thread(r);
Thread thdB = new Thread(r);
thdA.start();
thdB.start();
while (true)
{
double n = Math.random();
if (n >= 0.49999999 && n <= 0.50000001)
break;
}
thdA.interrupt();
thdB.interrupt();
}
}
在主线程中第一次创建一个Runnable的线程,包含了当前线程和名字。这个Runnbale声明了一个计数器,和将其放入到while的循环体内,然后不断地打印出一个线程的名字和计数器的值,在线程没有被打断前这个计数器是在不断地增加。
接下来是创建一对Thread的对象,这个线程是执行这个Runnable和开启后台的线程。
为了在打断线程之前,给后台的线程打印出几条信息,我们在主线程加入了一个while的循环语句,为个循环的设计为了消耗点时间。这个循环是在重复包含着一个随机数,直到个数是在我们规定的范围内。
Note 一个循环产生随机数的设计不是很好和想法,它会浪费处理器的周期。
主线程的循环结束后,主线程就会在每一个后台的线程Thread对象执行infterrupt()方法。接下来就是后台线程执行Thread.interrupted(),这个方法将会返回一个true,后台线程也就会结束。
执行上面的代码,你可能会看到如下的结果。
Thread-1: 67
Thread-1: 68
Thread-0: 768
Thread-1: 69
Thread-0: 769
Thread-0: 770
Thread-1: 70
Thread-0: 771
Thread-0: 772
Thread-1: 71
Thread-0: 773
Thread-1: 72
Thread-0: 774
Thread-1: 73
Thread-0: 775
Thread-0: 776
Thread-0: 777
Thread-0: 778
Thread-1: 74
Thread-0: 779
Thread-1: 75
源码下载:git@github.com:owenwilliam/Thread.git