并发(3) -- 中断

作者: 黑色偏幽默 | 来源:发表于2017-11-01 18:19 被阅读8次

线程状态

  1. 新建(new):线程创建时,它只会短暂的处于这种状态。此时它已经分配了必须的系统资源,并执行了初始化。此刻线程已经有资格获取 CPU 时间了,之后调度器将把这个线程转变为可运行或者阻塞。
  2. 可运行(Runnable):在这种状态下,只要调度器把时间片分配给线程,线程就可以运行。
  3. 阻塞(Blocked):线程能够运行,但有某个条件阻止其运行,调度器将忽略阻塞线程,不为其分配 CPU 时间。
  4. 死亡(Dead):处于终止状态,通常是从 run()方法放回,但线程还是可以被中断。

进入阻塞状态

  1. 通过调用 sleep() 使任务进入休眠状态,任务在指定时间内不会运行。
  2. 通过 wait() �使线程挂起,直到线程得到 notity() 和 notityAll()。
  3. 任务在等待某个输入/输出完成。
  4. 任务试图在某个对象上调用其同步方法,但锁不可用。

中断

Thread.interrupt() 方法可以终止被阻塞的线程,这个方法将设置中断状态。

如果一个线程已经被阻塞,或者试图执行一个阻塞操作,那么设置这个线程的中断状态,将会抛出 InterruptedException,而在抛出该异常或调用 Thread.interrupted() 后,中断状态将被复位。

cancel()

我们实现一个 runnable,可以看到在 Sleep 时是可以被中断阻塞的,实际上,任何要求抛出 InterruptedException 的调用都能被中断,但由于同步锁和 I/O 的阻塞却无法被中断。

public static void main(String[] args) {

    ExecutorService executorService = Executors.newCachedThreadPool();
    Future<?> future = executorService.submit(() -> {
        try {
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("before return");
    });
    try {
        TimeUnit.MILLISECONDS.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    future.cancel(true);
    executorService.shutdown();
}


before return
java.lang.InterruptedException: sleep interrupted

at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at Main$1.run(Main.java:15)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

使用 lookInterruptibly() 方式获取锁造成的阻塞可以被中断。

相关文章

  • 并发(3) -- 中断

    线程状态 新建(new):线程创建时,它只会短暂的处于这种状态。此时它已经分配了必须的系统资源,并执行了初始化。此...

  • 计算机操作系统笔记(四)

    2-3中断机制(SHD) 中断 中断定义 指CPU对突发的反应过程或机制 引入中断的目的 实现并发活动实现实时处理...

  • 并发

    并发 线程 Thread Runnable 中断线程 interrupt 调用该方法,线程的中断状态将被设置为tr...

  • Linux软中断

    中断是一种异步的事件处理机制,可以提高系统的并发处理能力。 中断处理程序在响应中断时,还会临时关闭中断。这就会导致...

  • 中断、异常与并发

    0. 前言 记得在学习《计算机系统组成原理》和阅读CSAPP时,对异常控制流(异常)、并发等内容似懂非懂、雾里看花...

  • 线程中断

    摘抄朴实的聊聊很多人会误解/不懂的Java并发中断机制 一、作用 1. 什么是中断 原来对中断的理解可能是: 你:...

  • Linux中断机制

    1、硬中断 2、软中断 3、软中断信号

  • 并发编程 —— 谈谈线程中断

    前言 如何中断一个线程,肯定不会使用 stop。而是使用 interrupt 方法。同时,我们知道,中断一个线程只...

  • Java 并发之线程中断

    一、前言 所谓线程中断,其实就是终止一个线程。在使用 Java 线程时,除了线程自行正常结束,很多时候也需要提前结...

  • Java并发之线程中断

    前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学...

网友评论

    本文标题:并发(3) -- 中断

    本文链接:https://www.haomeiwen.com/subject/kcigpxtx.html