005 线程打断

一 . 线程打断

  一个线程运行之后,我们就无法控制这个线程的具体的运行情况了.

  在一个特殊的情况下,我们需要终结一个无线循环的线程任务或者是一个长时间运行的线程任务该怎么办?

    在jdk之中,Thread类之中的很多方法都被废弃,原因就是这些方法是直接杀死线程,而线程获取的资源还可能未被释放.

      现在还剩下一个interrupt()方法可以帮助我们实现这个功能.


二 .线程打断

  首先看一下API的介绍:  

 public void interrupt() 

public static boolean interrupted()

 public boolean isInterrupted()

 [1]首先第一个方法是打断一个线程,该线程会抛出一个InterruptException,我们可以通过捕获这个异常来完成任务.

[2]第二个和第三个方法是判断一个线程是否被打断过.


三 . 线程打断的例子

  例子:

// 创建一个线程,这个线程无限的打印语句
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (;;) {
                        Thread.sleep(100);
                        System.out.println("thread running ...");
                    }
                } catch (Exception e) {
                    System.out.println("我接收到了一个被打断的异常信号");
                    // 自己终结自己
                    return;
                }
            }
        });
        // 开启线程
        thread.start();

        Thread.sleep(3000);
        // 打断子线程,子线程或抛出一个InterruptException
        thread.interrupt();
        System.out.println("main thread end..");

上面的例子之中,我们出现在主线程之中调用interrupt()方法打断子线程,子线程就会抛出一个异常,然后进入catch,我们就可以完成我们的终结子线程了.

  在上面的代码之中,我们同样可以加一个判断使用:interrupted()方法.

    这是建立在循环的情况下,另外以此循环的任务也不能过长.如果不符合,使用捕获异常的方式是比较合理的.


四 . 使用守护线程终结线程

  我们知道守护线程有一个特性,那就是守护线程的生命周期取决于其他的非守护线程.

  例子:   

Thread thread  = new Thread(new Runnable() {
            @Override
            public void run() {
                for(;;)
                    System.out.println("我是守护线程,帮助老大完成任务");
            }
        });
        thread.setDaemon(true);
        thread.start();
        
        //主线程
        Thread.sleep(3000);
        System.out.println("main thread ending ...");

上面的例子之中,我们使用daemon的方式终结了一个线程任务.

  当主线程完成了任务,子线程就没有必要存在了,比如子线程在做心跳检测.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/8995639.html
005