Java_Thread_interrupt中断线程

一直以来都有一个错误的理解,认为调用了interrupt()方法就会中断线程,但事实上并非如此,调用一个线程的interrupt方法会把线程的状态改为中断态,但是interrupt方法只作用于那些因为执行了sleep、wait、join方法而休眠的线程,使他们不再休眠,同时会抛出InterruptedException异常。

比如一个线程A正在sleep中,这时候另外一个程序里去调用A的interrupt方法,这时就会迫使A停止休眠而抛出InterruptedException异常;而如果线程A没有处于上面提到的三种休眠状态时被interrupt,这样就只是把线程A的状态改为interrupted,但是不会影响线程A的继续执行。

    /**
     * Interrupts this thread.
     *
     * <p> Unless the current thread is interrupting itself, which is
     * always permitted, the {@link #checkAccess() checkAccess} method
     * of this thread is invoked, which may cause a {@link
     * SecurityException} to be thrown.
     *
     * <p> If this thread is blocked in an invocation of the {@link
     * Object#wait() wait()}, {@link Object#wait(long) wait(long)}, or {@link
     * Object#wait(long, int) wait(long, int)} methods of the {@link Object}
     * class, or of the {@link #join()}, {@link #join(long)}, {@link
     * #join(long, int)}, {@link #sleep(long)}, or {@link #sleep(long, int)},
     * methods of this class, then its interrupt status will be cleared and it
     * will receive an {@link InterruptedException}.
     *
     * <p> If this thread is blocked in an I/O operation upon an {@link
     * java.nio.channels.InterruptibleChannel </code>interruptible
     * channel<code>} then the channel will be closed, the thread's interrupt
     * status will be set, and the thread will receive a {@link
     * java.nio.channels.ClosedByInterruptException}.
     *
     * <p> If this thread is blocked in a {@link java.nio.channels.Selector}
     * then the thread's interrupt status will be set and it will return
     * immediately from the selection operation, possibly with a non-zero
     * value, just as if the selector's {@link
     * java.nio.channels.Selector#wakeup wakeup} method were invoked.
     *
     * <p> If none of the previous conditions hold then this thread's interrupt
     * status will be set. </p>
     *
     * <p> Interrupting a thread that is not alive need not have any effect.
     *
     * @throws  SecurityException
     *          if the current thread cannot modify this thread
     *
     * @revised 6.0
     * @spec JSR-51
     */
    public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }
时间: 2024-10-23 02:03:58

Java_Thread_interrupt中断线程的相关文章

Java多线程与并发——死锁与中断线程

过多的同步有可能出现死锁,死锁的操作一般是在程序运行的时候才有可能出现. 多线程中要进行资源的共享,就需要同步,但同步过多,就可能造成死锁. 死锁例子: package com.vince; /** * 线程死锁 * @author acer * */ public class DeadThreadDemo { public static void main(String[] args) { new DeadThread(); } } //顾客 class Customer{ public sy

Java多线程学习之线程的状态及中断线程

线程的状态 新建(new):当线程被创建时,它只会短时间处于这种状态.它已经分配了必要的系统资源,完成了初始化.之后线程调度器将把这个线程转变为可运行或者阻塞状态: 就绪(Runnable):在这种状态下,只要调度器分配时间片给线程,线程就可以运行了: 阻塞(Blocked):有某个条件阻止线程运行,调度器将忽略阻塞状态的线程,不会分配时间片给它,直到线程进入就绪状态,它才有可能执行: 死亡(Dead):处于死亡或者终结状态的线程将不再是可调度的,并且也不会被分配到时间片.任务死亡的方式通常是从

中断线程

中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程为中断状态,即设置为true.线程中断后的结果是死亡.还是等待新的任务或是继续运行至下一步,取决于这个程序本身.线程会不时地检测这个中断标识位,以判断线程是否应该被中断(中断标识值是否为true).它并不像stop方法那样会中断一个正在运行的线程. 判断线程是否被中断 判断某个线程是否已被中断, 请使用Thread.currentThread().isInterrupted()方法(因为它将线程中断标识位设置为tr

Java 可中断线程

PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecation") public static void main(String[] args) throws Exception { Thread th = new Thread(new TestRunnable()); // 启动线程 System.out.println("main: start

JAVA学习笔记(四十)- 守护线程与中断线程

守护线程 /* * Daemon线程,即守护线程 * 一般都在后台运行,为其他线程提供服务,不能单独存在 */ public class Test08 { public static void main(String[] args) { MyThread8 t1 = new MyThread8("守护线程"); System.out.println("是守护线程吗?"+t1.isDaemon()); t1.setDaemon(true); System.out.pr

java多线程--中断线程

2. 终止线程的方式 Thread中的stop()和suspend()方法,由于固有的不安全性,已经建议不再使用! 下面,我先分别讨论线程在"阻塞状态"和"运行状态"的终止方式,然后再总结出一个通用的方式. 2.1 终止处于"阻塞状态"的线程 通常,我们通过"中断"方式终止处于"阻塞状态"的线程. 当线程由于被调用了sleep(), wait(), join()等方法而进入阻塞状态:若此时调用线程的inte

Java多线程和并发(六),yield函数和中断线程

目录 1.yield函数 2.中断线程 六.yield函数和中断线程 1.yield函数 2.中断线程 (1)已经被抛弃的方法 (2)目前使用的方法 原文地址:https://www.cnblogs.com/xzmxddx/p/10362835.html

java多线程技术: interrupt() 中断线程, 优雅停止线程及原理

MyThread.class package cn.yilong.edcsapiservice.thread; public class MyThread extends Thread { @Override public void run() { System.out.println("开始睡觉"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out

Java 中断线程