`
Copperfield
  • 浏览: 260387 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25151
社区版块
存档分类

并发编程陷阱系列(三)使用Thread.interrupt()中断线程

 
阅读更多

Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出 阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

 

建议使用外部的布尔变量进行控制,比如:

class MyThread extends Thread
{
  volatile boolean finished = false;

  public void stopMe()
  {
    finished = true;
  }

  public void run()
  {
    while (!finished)
    {
      //do dirty work
    }
  }
}

   

 

public class AlternateStop implements Runnable {
	private volatile boolean stopRequested;
	private Thread runThread;

	public void run() {
		runThread = Thread.currentThread();
		stopRequested = false;
		int count = 0;
		while (!stopRequested) {
			System.out.println("Running ... count=" + count);
			count++;
			try {
				Thread.sleep(300);
			} catch (InterruptedException x) {
				System.out.println("捕获异常后---"+Thread.currentThread().isInterrupted());
				Thread.currentThread().interrupt(); // re-assert interrupt
				System.out.println("重新设置打断状态---"+Thread.currentThread().isInterrupted());
			}
		}

		System.out.println("stoped");
	}

	public void stopRequest() {
		stopRequested = true;
		if (runThread != null) {
			runThread.interrupt();
		}
	}

	public static void main(String[] args) {
		AlternateStop as = new AlternateStop();
		Thread t = new Thread(as);
		t.start();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException x) {
			// ignore
		}
		as.stopRequest();
	}
}

 注意当一个阻塞方法检测到中断并抛出 InterruptedException 时,它清除中断状态,为了让上层代码知道    该线程的状态,重新设置打断状态。

System.out.println("捕获异常后---"+Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt(); // re-assert interrupt
System.out.println("重新设置打断状态---"+Thread.currentThread().isInterrupted());

   以上三行代码会打印:

  捕获异常后---false
  重新设置打断状态---true

分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    Java并发编程实战(中文版).7z

    9. **中断线程**:Java提供了Thread类的interrupt()和isInterrupted()方法来中断和检查线程的中断状态。不过需要注意的是,中断并不意味着立即停止线程,而是向线程发送一个中断信号,由线程自己决定如何响应。 10....

    《Java并发编程实战》PDF版本下载.txt

    - `interrupt()`:中断线程。 - `isAlive()`:判断线程是否处于活动状态。 - `getName()`/`setName()`:获取/设置线程名称。 - `getId()`:获取线程ID。 - `getPriority()`/`setPriority()`:获取/设置线程优先级。 ...

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

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

    Java并发编程实践

    1.3.3 使用中断(Interrupt)取消线程........................................................................15 1.3.4 使用Stop 终止线程........................................................................

    JAVA并发编程艺术pdf版

    - interrupt()方法用于中断线程,isInterrupted()和interrupted()检查线程是否被中断,通常配合循环使用,中断标志可以作为退出循环的条件。 通过深入学习《JAVA并发编程艺术》,开发者能更好地理解并发编程的原理...

    Java并发编程线程入门简介.pdf

    4. **线程管理**:`Thread`类提供了管理线程生命周期的方法,如`sleep()`使当前线程休眠指定时间,`interrupt()`中断线程,以及`join()`等待线程结束等。`sleep()`可能会被`InterruptedException`打断,所以在使用时...

    java线程与并发编程实践

    Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    Java并发编程线程入门简介[借鉴].pdf

    总的来说,Java并发编程线程入门需要理解进程和线程的概念,熟悉线程的创建与管理,掌握线程同步和互斥的机制,以及如何处理线程中断和异常。随着Java并发库的不断发展,开发者现在有更多的工具和策略来解决并发问题...

    Java并发基础共6页.pdf.zip

    9. **中断**:`Thread.interrupt()`方法可以用来中断线程,而`isInterrupted()`和`interrupted()`方法则用于检查中断状态。 10. **守护线程(Daemon Thread)**:守护线程不阻止JVM的退出,常用于后台服务,如垃圾...

    并发编程面试专题.pdf

    ### 并发编程面试专题知识点解析 #### 一、线程执行顺序控制 **知识点:** 1. **问题描述:** 如何确保线程T2在T1执行完毕后开始执行,T3在T2执行完毕后开始执行? 2. **解决方案:** 可以通过`Thread.join()`方法...

    并发编程的艺术

    创建线程、启动线程、线程的生命周期(新建、就绪、运行、阻塞、死亡)以及线程间的通信(join、interrupt、yield、sleep)都是并发编程的基本操作。 3. **线程池**:Executor框架是Java 5引入的,用于管理和控制...

    为什么不鼓励使用 Thread.stop?

    标题 "为什么不鼓励使用 Thread.stop" 涉及到的是Java多线程编程中的一个重要话题,主要探讨了为何在实际开发中不建议直接使用 `Thread.stop` 方法来终止一个线程的执行。 在Java中,`Thread.stop` 被设计为停止一...

    java 并发编程 code.zip

    Java并发编程是Java开发中的重要领域,它涉及到多线程的使用、同步机制以及线程安全的实现。在Java中,并发编程可以帮助我们利用多核处理器的优势,提高程序的执行效率,但同时也需要处理好线程间的交互和数据一致性...

    java并发编程分享

    Thread类的interrupt()方法用于中断线程,而isInterrupted()和interrupted()检查中断状态。在并发编程中,正确处理InterruptedException是至关重要的。 以上就是Java并发编程的一些核心知识点。在实际开发中,熟练...

    JavaThread.pdf

    - Thread.getThreadGroup()获取线程所属的线程组,Thread.interrupt()和Thread.currentThread().interrupted()分别用于中断和检查当前线程是否被中断。 10. **线程的等待/通知机制** - 使用wait()、notify()、...

    Java多线程、并发编程知识点总结.pdf

    3. **Thread类的方法**:包括start()方法用于启动线程,sleep()方法用于使当前线程休眠指定的时间,interrupt()方法用于中断线程,join()方法用于让一个线程等待另一个线程完成等。 4. **线程状态**:Java线程具有...

    Java如何中断一个正在运行的线程[整理].pdf

    在Java编程中,多线程是并发执行任务的关键机制,但同时也带来了许多挑战,其中之一就是如何安全地中断一个正在运行的线程。本篇文章主要探讨了如何正确地中断线程,避免潜在的问题。 首先,我们要明确一点:Java中...

Global site tag (gtag.js) - Google Analytics