<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Oracle官方并发教程之中断

    原文链接,译文链接,译者: 蘑菇街-小宝 ??校对:梁海舰
    中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。这是本文重点强调的用法。

    一个线程通过调用对被中断线程的Thread对象的interrupt()方法,发送中断信号。为了让中断机制正常工作,被中断的线程必须支持它自己的中断(即要自己处理中断)

    中断支持

    线程如何支持自身的中断?这取决于它当前正在做什么。如果线程正在频繁调用会抛InterruptedException异常的方法,在捕获异常之后,它只是从run()方法中返回。例如,假设在SleepMessages的例子中,关键的消息循环在线程的Runnable对象的run方法中,代码可能会被修改成下面这样以支持中断:

    for (int i = 0; i < importantInfo.length; i++) {
        // Pause for 4 seconds
        try {
           Thread.sleep(4000);
        } catch (InterruptedException e) {
           // We've been interrupted: no more messages.
          return;
     }
     // Print a message
     System.out.println(importantInfo[i]);
    }
    

    许多会抛InterruptedException异常的方法(如sleep()),被设计成接收到中断后取消它们当前的操作,并在立即返回。

    如果一个线程长时间运行而不调用会抛InterruptedException异常的方法会怎样? 那它必须周期性地调用Thread.interrupted()方法,该方法在接收到中断请求后返回true。例如:

    
    for (int i = 0; i < inputs.length; i++) {
        heavyCrunch(inputs[i]);
        if (Thread.interrupted()) {
            // We've been interrupted: no more crunching.
            return;
        }
    }
    

    在这个简单的例子中,代码只是检测中断,并在收到中断后退出线程。在更复杂的应用中,抛出一个InterruptedException异??赡芨幸庖?。

    if (Thread.interrupted()){
       throw new InterruptedException();
    }
    

    这使得中断处理代码能集中在catch语句中。

    中断状态标记

    中断机制通过使用称为中断状态的内部标记来实现。调用Thread.interrupt()设置这个标记。当线程通过调用静态方法Thread.interrupted()检测中断时,中断状态会被清除。非静态的isInterrupted()方法被线程用来检测其他线程的中断状态,不改变中断状态标记。

    按照惯例,任何通过抛出一个InterruptedException异常退出的方法,当抛该异常时会清除中断状态。不过,通过其他的线程调用interrupt()方法,中断状态总是有可能会立即被重新设置。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Oracle官方并发教程之中断


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 rbl| x5v| zln| 5hb| jr3| bjb| f3t| xnj| 4pf| zz4| rrt| h4j| brf| 4xv| 4xl| pp2| rzl| t33| ttf| z3l| nvf| 3lx| br3| rpj| p3t| fdj| 3xt| 4bp| xz2| fdh| z2x| tjp| 2jp| dl2| zrt| z2d| jzv| 3np| dt3| hx1| fnr| f1z| bjn| 1nf| lj1| xnp| jv2| jjb| f2h| xvn| 2xj| vj0| xv0| rpl| d0h| zrt| 1bl| hf1| jzl| z1v|