代码之家  ›  专栏  ›  技术社区  ›  Amit

Java线程问题

  •  4
  • Amit  · 技术社区  · 14 年前

    我的问题涉及所有这些方法(包括 Thread.sleep(...) )哪个投掷 InterruptedException .

    我在Sun的教程中发现一个声明说

    中断例外 是一个例外 sleep 当另一个线程在睡眠处于活动状态时中断当前线程时引发。

    这意味着如果 睡觉 中断时是否未激活?

    假设我有两条线: threadOne threadTwo 三氧化二氢 创建并启动 螺纹2 . 螺纹2 执行runnable,其run方法如下:

    public void run() {
        :
        :
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            return;
        }
        :
        :
        : // In the middle of two sleep invocations
        :
        :
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            return;
        }
        :
        :
    }
    

    创建线程后, 三氧化二氢 中断 螺纹2 . 假设 螺纹2 是在两次睡眠调用中间被中断的时候(当没有睡眠方法处于活动状态时),那么第二次睡眠方法会抛出 InterrupteException 一旦被调用?

    如果不是,那么这个中断会永远被忽略吗?

    如何确定 螺纹2 总是会知道中断(不管它的睡眠方法之一是活动的还是不活动的)?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Michael Borgwardt    14 年前

    在Sun的Windows JDK上,线程实际上会抛出 InterruptedException 进入时 sleep() :

    public static final void main(String args[]) throws Exception {
        final Thread main = Thread.currentThread();
        Thread t = new Thread() {
            @Override
            public void run() {
                main.interrupt();
            }
        };
        t.start();
        t.join();
        Thread.sleep(1000);
        System.out.println("Not interrupted!");
    }
    

    API文件 睡眠() 可以解释为这是强制性行为:

    引发InterruptedException-如果有的话 线程中断了电流 线程。的中断状态 当前线程在此情况下被清除 引发异常。

    但这不是很清楚,所以我不会依赖它,而是检查 isInterrupted() 手动。

        2
  •  3
  •   Andrea Polci    14 年前

    来自JavaDoc:

    如果此线程在 调用wait(),wait(long), 或等待(long,int)方法 对象类或join()的, join(长),join(长,int) 睡眠(长),或睡眠(长,int) 这个类的方法,然后它的 中断状态将被清除,并且 它将收到一个 中断异常。

    如果此线程在I/O中被阻塞 可中断操作 然后频道将 关闭,线程的中断状态 将被设置,线程将 接收CloseDBYInterruptException。

    如果此线程在 然后选择线程的中断 状态将被设置并返回 立即从所选内容 操作,可能带有非零 值,就像选择器 已调用唤醒方法。

    如果没有以前的条件 保持这个线程的中断 将设置状态。

    这意味着您必须检查被中断的状态,以确保您的线程知道该中断。这可以通过两种方法完成:IsInterrupted()和Interrupted()。最后一个清除中断状态。

    像这样:

    while(!Thread.interrupted()) {
      ...
      try {
        Thread.sleep(10 * 1000);
      } catch (InterruptedException e) {
        return;
      }
    }
    
        3
  •  2
  •   John Flatness    14 年前

    Java文档有点误导性。如果设置了线程的中断状态,则调用 sleep() 在那条线上会导致 InterruptException 立即扔掉。

    即使线程被中断,这也适用 之前 睡眠() 被呼叫。

    不过,如上所述,您也可以 Thread.isInterrupted() 如果你想自己处理中断。

        4
  •  -1
  •   Daniel Bleisteiner    14 年前

    InterruptOnException只在线程休眠期间才感兴趣。如果线程在以前的任何地方被中断,那么稍后的sleep()调用不会抛出它。只有在sleep()时的中断才重要,因为它正好中断了sleep()调用。