Java并发编程(二)线程任务的中断(interrupt)

使用interrupt()中断线程

  当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。

package com.csdhsm.concurrent;

import java.util.concurrent.TimeUnit;

/**
 * @Title: InterruptDemo.java
 * @Package: com.csdhsm.concurrent
 * @Description 中断Demo
 * @author Han
 * @date 2016-4-18 下午6:55:00
 * @version V1.0
 */ 

public class InterruptDemo implements Runnable {

    @Override
    public void run() {

        System.out.println("The thread is runing.");
        System.out.println("The thread is sleeping.");
        try {

            //子线程休眠20秒,等待被打断
            TimeUnit.SECONDS.sleep(20);
            System.out.println("The thread is wake up");
        } catch (InterruptedException e) {

            System.out.println("The thread is interrupted");
        }

        //此处会继续执行下去
        System.out.println("The thread is terminal");
    }

    public static void main(String[] args) throws InterruptedException {

        Thread t = new Thread(new InterruptDemo());
        t.start();

        System.out.println("The Main is sleeping to wait the thread start!");
        //主线程休眠2秒,等待子线程运行
        TimeUnit.SECONDS.sleep(2);

        System.out.println("The thread would be interrupted");
        t.interrupt();
    }
}

结果

特别要注意的是标红的地方:如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。

使用isInterrupted()方法判断中断状态

  可以在Thread对象上调用isInterrupted()方法来检查任何线程的中断状态。这里需要注意:线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回false。

package com.csdhsm.concurrent;

import java.util.concurrent.TimeUnit;

/**
 * @Title: InterruptedCheck.java
 * @Package: com.csdhsm.concurrent
 * @Description Interrupted 测试
 * @author Han
 * @date 2016-4-18 下午7:44:12
 * @version V1.0
 */ 

public class InterruptedCheck {

    public static void main(String[] args) {

        Thread t = Thread.currentThread();

        System.out.println("Current Thread`s statusA is " + t.isInterrupted());
        //自己中断自己~
        t.interrupt();
        System.out.println("Current Thread`s statusC is " + t.isInterrupted());
        System.out.println("Current Thread`s statusB is " + t.isInterrupted());

        try {

            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {

            System.out.println("Current Thread`s statusD is " + t.isInterrupted());
        }

        System.out.println("Current Thread`s statusE is " + t.isInterrupted());
    }
}

结果

使用interrupted()方法判断中断状态

  可以使用Thread.interrupted()方法来检查当前线程的中断状态(并隐式重置为false)。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。

package com.csdhsm.concurrent;

/**
 * @Title: InterruptedCheck.java
 * @Package: com.csdhsm.concurrent
 * @Description Interrupted 测试
 * @author Han
 * @date 2016-4-18 下午7:44:12
 * @version V1.0
 */ 

public class InterruptedCheck {

    public static void main(String[] args) {

        Thread t = Thread.currentThread();

        System.out.println("Current Thread`s statusA is " + t.interrupted());
        //自己中断自己~
        t.interrupt();
        System.out.println("Current Thread`s statusC is " + t.interrupted());
        System.out.println("Current Thread`s statusB is " + t.interrupted());
        System.out.println("Current Thread`s statusD is " + t.interrupted());
    }
}

结果

注意看红色的标记

时间: 2024-11-05 15:53:16

Java并发编程(二)线程任务的中断(interrupt)的相关文章

【转】Java并发编程:线程池的使用

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

Java并发编程:线程池的使用(转)

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) 一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新

JAVA并发编程3_线程同步之synchronized关键字

在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public class Test implements Runnable { private int i = 0; private int getNext() { return i++; } @Override public void run() { // synchronized while (true) { synchro

Java并发编程:线程的同步

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

Java并发编程:线程的创建

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

JAVA并发编程4_线程同步之volatile关键字

上一篇博客JAVA并发编程3_线程同步之synchronized关键字中讲解了JAVA中保证线程同步的关键字synchronized,其实JAVA里面还有个较弱的同步机制volatile.volatile关键字是JAVA中的轻量级的同步机制,用来将变量的更新操作同步到其他线程.从内存可见性的角度来说,写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块. 旧的内存模型:保证读写volatile都直接发生在main memory中. 在新的内存模型下(1.5)

Java并发编程之线程池

一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(BlockingQueue),线程池里的线程会去取这个队列里的任务. 利用线程池有三个好处: 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行 提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,

JAVA并发编程2_线程安全&内存模型

"你永远都不知道一个线程何时在运行!" 在上一篇博客JAVA并发编程1_多线程的实现方式中后面看到多线程中程序运行结果往往不确定,和我们预期结果不一致.这就是线程的不安全.线程的安全性是非常复杂的,没有任何同步的情况下,多线程的执行顺序是不可预测的.当多个线程访问同一个资源时就会出现线程安全问题.例如有一个银行账户,一个线程往里面打钱,一个线程取钱,要是得到不确定的结果那是多么可怕的事情. 引入: 例如下面的程序,在单线程下,执行两次i++理论上i的最终值是12,但是在多线程环境下则不