1.2执行更高级的线程任务(Performing More Advanced Thread Tasks)

来源:互联网 发布:csmar数据库 编辑:程序博客网 时间:2024/06/09 15:40

在前面的线程任务都连接着一个设定的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(){@Overridepublic 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: 67Thread-1: 68Thread-0: 768Thread-1: 69Thread-0: 769Thread-0: 770Thread-1: 70Thread-0: 771Thread-0: 772Thread-1: 71Thread-0: 773Thread-1: 72Thread-0: 774Thread-1: 73Thread-0: 775Thread-0: 776Thread-0: 777Thread-0: 778Thread-1: 74Thread-0: 779Thread-1: 75

  源码下载:git@github.com:owenwilliam/Thread.git

阅读全文
0 0
原创粉丝点击