【问题标题】:How can i understand Thread.interrupt()?我如何理解 Thread.interrupt()?
【发布时间】:2013-01-06 13:27:11
【问题描述】:

java中有两个代码块。

第一块:

@Test
public void test1() {

    System.out.println("interrupt:" + Thread.currentThread().isInterrupted());
    Thread.currentThread().interrupt();
    System.out.println("interrupt:" + Thread.currentThread().isInterrupted());

}

输出:

interrupt:false
interrupt:true

第二座:

@Test
public void test2() throws InterruptedException {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("running...");
        }
    });

    thread.interrupt();

    TimeUnit.SECONDS.sleep(2);

    System.out.println("interrupt:" + thread.isInterrupted());

    thread.start();

    TimeUnit.SECONDS.sleep(2);

    System.out.println("interrupt:" + thread.isInterrupted());

}

输出:

interrupt:false
running...
interrupt:false

所以,我的问题:

  1. 为什么在调用interrupt() 后阻止打印interrupt:true 而阻止第二个打印?
  2. 调用interrupt()后JVM会做什么?

谢谢!

PS:第三块:

@Test
public void test3() {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("running...");
        }
    });

    thread.interrupt();

    System.out.println("interrupt:" + thread.isInterrupted());

    // thread.start();
    //
    // thread.interrupt();
    //
    //
    // System.out.println("interrupt:" + thread.isInterrupted());

}

同时输出:interrupt:false

【问题讨论】:

  • 在线程启动之前中断线程是无操作的。

标签: java multithreading jvm


【解决方案1】:
  • 在块 1 中,您中断自己,这用中断标志“标记”线程。
  • 在块 2 中,您中断了其他线程(即不活动的 - 未启动 -)

尝试在 run() 方法中添加 Thread.sleep(5000);并在中断之前开始;-)

How interrupt works

【讨论】:

  • 编辑了您的答案以包含 Java 7 文档(Java 6 文档没有解释当您在未启动的线程上调用中断时会发生什么)。
  • @Perception in Java 6 doc 解释与 Java 7 相同,只是更改 css ;-) “中断不活动的线程不需要任何效果。”
【解决方案2】:

这很容易。由于sleep 文档:

InterruptedException - if another thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

当您调用interrupt 并且线程处于休眠状态时,会引发异常并且它只是清除了interrupted 标志。

第三块:

由于文档:Interrupting a thread that is not alive need not have any effect.所以总结一下:如果你的线程还没有开始interrupt方法可能不起作用。

【讨论】:

  • 什么鬼?为什么有人-1我?
【解决方案3】:

java.lang.Thread的源代码中,对于interrupt方法,文档清楚地写着:

中断一个不活跃的线程不需要有任何效果。

  888       /**
  889        * Interrupts this thread.
  890        *
  891        * <p> Unless the current thread is interrupting itself, which is
  892        * always permitted, the {@link #checkAccess() checkAccess} method
  893        * of this thread is invoked, which may cause a {@link
  894        * SecurityException} to be thrown.
  895        *
  896        * <p> If this thread is blocked in an invocation of the {@link
  897        * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link
  898        * Object#wait(long, int) wait(long, int)} methods of the {@link Object}
  899        * class, or of the {@link #join()}, {@link #join(long)}, {@link
  900        * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)},
  901        * methods of this class, then its interrupt status will be cleared and it
  902        * will receive an {@link InterruptedException}.
  903        *
  904        * <p> If this thread is blocked in an I/O operation upon an {@link
  905        * java.nio.channels.InterruptibleChannel </code>interruptible
  906        * channel<code>} then the channel will be closed, the thread's interrupt
  907        * status will be set, and the thread will receive a {@link
  908        * java.nio.channels.ClosedByInterruptException}.
  909        *
  910        * <p> If this thread is blocked in a {@link java.nio.channels.Selector}
  911        * then the thread's interrupt status will be set and it will return
  912        * immediately from the selection operation, possibly with a non-zero
  913        * value, just as if the selector's {@link
  914        * java.nio.channels.Selector#wakeup wakeup} method were invoked.
  915        *
  916        * <p> If none of the previous conditions hold then this thread's interrupt
  917        * status will be set. </p>
  918        *
  919        * <p> Interrupting a thread that is not alive need not have any effect.
  920        *
  921        * @throws  SecurityException
  922        *          if the current thread cannot modify this thread
  923        *
  924        * @revised 6.0
  925        * @spec JSR-51
  926        */
  927       public void interrupt() {
  928           if (this != Thread.currentThread())
  929               checkAccess();
  930   
  931           synchronized (blockerLock) {
  932               Interruptible b = blocker;
  933               if (b != null) {
  934                   interrupt0();           // Just to set the interrupt flag
  935                   b.interrupt(this);
  936                   return;
  937               }
  938           }
  939           interrupt0();
  940       }

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    相关资源
    最近更新 更多