`

线程中断(转载)

阅读更多

本文转载自:http://blog.chinaunix.net/uid-122937-id-215995.html

1.中断概述
      在多线程编程中经常会遇到需要中止线程的情况,比如启动多个线程去数据库中搜索,如果有一个线程返回了结果,其他线程就可以取消了。

中断线程的三个相差函数
            1.通过成员方法Thread.interrupt()来设置中断状态为true
            2.通过成员方法Thread.isInterrupted()来获取中断状态
            3.通过静态方法Thread.interrupted()来获取中断状态,并且清除中断状态(当然获取的是清除之前的值),也就是说连续两次调用此方法,第二次一定会返回false。

对正在运行的线程调用
interrupt(),并不会使线程停止运行,而只是让线程暂停一会,详见《例1:中断但不停止线程的运行》。因为Thread.interrupt() 对正在运行的线程是不起作用的,只有对阻塞的线程有效

离开线程有三种常用的方法:
1.在阻塞操作时如Thread.sleep()时被中断会抛出InterruptedException
       Thread.interrupt()方法实际上只是设置了一个中断状态,当该线程由于下列原因而受阻时,这个中断状态就起作用了:
      (1)如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获 InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。
      详见《例2:线程在sleep时调用interrupt

      (2)如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException,而不是InterruptedException 异常。
     
      (3)如果使用Java1.0之前就存在的传统的I/O操作,并且线程处于阻塞状态,Thread.interrupt()将不起作用,线程并不能退出阻塞状态。
               例如对于socket,通过调用阻塞该线程的套接字的close()方法。如果线程被I/O操作阻塞,该线程将接收到一个SocketException异常,这与使用interrupt()方法引起一个InterruptedException异常被抛出非常相似。
      详见《例6:通过SocketException异常中断阻塞线程

2.Thread.interrupted()检查是否发生中断
      对于正在运行的线程,如果调用thread.interrupt()。可以通过Thread.interrupted()能告诉你线程是否发生中断,并将清除中断状态标记,所以程序不会两次通知你线程发生了中断。
      详见《例3:通过interrupted中断线程

      如果sleep和interrupted检查结合使用,可能会产生两个结果。
      详见《例4: 通过interrupted和sleep中断线程,停止线程的执行

3.使用共享变量控制
      使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。
      详见《例5:通过共享变量中断线程,停止线程的执行

      这个方法虽然给予线程机会进行必要的清理工作,这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法(synchronized blocks/methods)中。

      但是,当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。
      他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。

总结
      不存在这样一种机制对所有的情况都适用,但是,根据情况不同却可以使用特定的技术。
      详见《java线程技术8_线程中断最佳实践

分享到:
评论

相关推荐

    C++11 线程的中断,继续以及停止

    C++11关于thead的应用,利用std::condition std::mutex提供如何中断,停止和继续功能,

    Java并发编程示例(三):线程中断

    Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...

    Java线程中断示例程序的代码清单.pdf

    Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...

    java线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本概念。栈是一种后进先出(LIFO, Last In First Out)的数据结构,它允许数据被存储和检索,但只允许在一段称为...

    Java多线程中断机制三种方法及示例

    "Java多线程中断机制三种方法及示例" Java多线程中断机制是Java编程语言中一个重要的概念,涉及到线程的生命周期和线程的协作机制。中断机制是一种协作机制,通过中断并不能直接终止另一个线程,而需要被中断的线程...

    Java-并发-Java线程中断与停止线程详解

    线程中断   Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止

    Java通过`Thread.interrupt()`方法提供线程中断机制。当调用一个线程的`interrupt()`方法时,并不会立即停止该线程,而是设置线程的中断状态。线程需要通过检查`InterruptedException`异常来响应中断。例如,当线程...

    Java多线程之中断线程(Interrupt)的使用详解

    Java中的多线程允许并发执行多个任务,而中断机制是Java提供的一种优雅地停止线程执行的方式。`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的...

    java中断线程的正确姿势完整示例.rar

    线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程应该尽快结束。线程需要定期检查中断状态,并...

    Java并发编程示例(四):可控的线程中断

    在Java并发编程中,线程中断是一个重要的概念,它允许我们优雅地停止正在运行的线程,而不是简单地杀死它们。在"Java并发编程示例(四):可控的线程中断"中,我们将深入理解如何利用`InterruptedException`来更好地...

    Java基本功之中断线程的理解[参考].pdf

    Java中的线程中断是多线程编程中一个重要的概念,主要用来优雅地停止线程的执行。线程中断并不是立即终止线程,而是设置线程的中断状态,并通过特定方式来响应这个中断请求。以下是对Java中断线程的详细解释: 1. *...

    AYSP#book-3#线程中断1

    } catch (InterruptedException e) {//处理完中断异常后,返回到run()方法入口//如果没有return,线程不会实际被中断,

    java多线程中断代码详解

    Java 多线程中断代码详解 Java 中断机制是多线程编程中的一种重要机制。它允许一个线程请求另一个线程停止执行某个操作或退出线程。Java 提供了多种方式来中断线程,包括使用 stop() 方法、interrupt() 方法和使用 ...

    详解Java线程中断知识点

    Java线程中断是多线程编程中一个关键的概念,它允许一个线程在运行时被其他线程“通知”停止其当前活动。线程中断不是立即终止线程,而是发送一个中断信号,由目标线程自己决定如何响应这个信号。在Java中,线程中断...

    java线程阻塞中断与LockSupport使用介绍

    如果线程中断状态已经设置,`park()` 会立即返回,即使没有调用过`unpark()`。 **7. Thread.interrupt()处理是否有回调函数?** Java API中并没有提供线程中断的直接回调函数。但是,可以通过在`run()` 方法中检查...

    java通过线程控制程序执行超时(新)

    Java的线程提供了中断机制,通过`Thread.interrupt()`和`Thread.isInterrupted()`方法来控制和检查线程中断状态。在长时间运行的任务中,应定期检查中断标志,一旦检测到中断,及时清理资源并退出。 ```java ...

    浅析java线程中断的办法

    在Java中,线程中断是一种重要的协作机制,用于控制线程的停止。线程中断并不会真正强制线程停止,而是通过一种协作的方式使得线程能够适时地停下来。Java提供了中断线程的机制,但并不提供直接停止线程的方法,因为...

Global site tag (gtag.js) - Google Analytics