`
xhfei
  • 浏览: 115873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Thread.interrupt() 如何使用

阅读更多
今天看到一个blogger说:好记性,不如烂博客。
还是蛮有道理的,踏实的记录,经常的回顾。
写blog贵在坚持写和常回来看看。
言归正传,今天研究了一下Thread.interrupt()方法,这个方法很有意思,Thread.interrupt()的调用对正在运行的线程是不起作用的,只有对阻塞的线程有效。
  
引用
Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

    因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。

例如:
public class CountupThread extends Thread{
	private long counter=0;
	private volatile boolean shutdownRequests=false;
	public void shutdownRequest(){
		shutdownRequests=true;
		interrupt();
	}
	public final void run(){
		try {
			while (!shutdownRequests) {
				doWork();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			doShutdown();
		}
	}
	private void  doWork() throws InterruptedException{
		counter++;
		System.out.println("doWork:counter="+counter);
		Thread.sleep(500);
	}
	private void doShutdown(){
		System.out.println("doShutdown:counter="+counter);
	}
}

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Main:begin");
		CountupThread t=new CountupThread();
		try {
			t.start();
			Thread.sleep(10000);
			System.out.println("Main:shutDownRequest");
			t.shutdownRequest();
			System.out.println("Main:join");
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println(t.isAlive());
		System.out.println("Main:end");
	}
}
分享到:
评论

相关推荐

    Thread.interrupt()方法的使用以及使用它退出线程

    Thread.interrupt()方法的使用以及使用它退出线程

    线程外部挂起恢复控制(不使用Suspend与Resume中止线程)

    自.NET 2.0以来,Thread.Suspend()与Thread.Resume()方法已过时,VS提示可以使用如Monitor等技术,但是对于刚接触...相关技术参考:http://msdn.microsoft.com/zh-cn/library/system.threading.thread.interrupt.aspx

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

    `Thread.interrupt` 方法是一个比较安全的替代方案,它会设置线程的中断状态,并且许多阻塞方法(如 `Thread.sleep`, `Object.wait`)在被中断时会抛出 `InterruptedException`,使得线程可以捕获这个异常并进行必要...

    Java中interrupt的使用.docx

    取而代之的是使用中断机制,这个机制主要通过`interrupt()`, `isInterrupted()`, 和 `interrupted()`三个方法来实现。 1. `interrupt()`方法:这个方法是用来设置目标线程的中断状态。当你在一个线程上调用另一个...

    java线程强制停止的两个Demo

    Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`interrupted()`状态来优雅地停止线程。这种方式允许线程清理资源并正常退出...

    浅谈Java线程Thread之interrupt中断解析

    需要注意的是,在使用interrupt机制时,需要注意线程的中断状态位的变化,避免使用Thread.interrupted()方法来判断线程是否被中断,因为该方法调用后会将中断标示位清除,即重新设置为false。 Java线程Thread之...

    JavaThread.pdf

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

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

    总结来说,中断Java线程的关键在于理解和使用`Thread.interrupt()`的正确方式,结合`volatile`共享变量来协调线程间的通信。通过这样的方法,可以确保线程在接收到中断请求后,安全地停止当前任务,而不是强制终止。...

    Java interrupt()方法使用注意_动力节点Java学院整理

    // 或者使用 thread.interrupt(); 与 stop 变量配合使用 } } ``` 在这个例子中,线程会在每次循环迭代时检查`stop`变量和中断状态,一旦发现中断请求,就会退出循环并清理资源。这种方法比直接使用`Thread.stop`...

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

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

    Thread类的interrupt(),interrupted(),isInterrupted()1

    在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...

    javathread.part04.rar

    - 使用`Thread.currentThread().getName()`获取当前线程名,便于调试。 这些知识点是Java线程编程的基础,理解并掌握它们对于开发高效的并发程序至关重要。`javathread.part04.rar`中的资料可能包含了上述部分或...

    线程常用方法示例

    本示例着重讲解几个关键的线程方法,包括`Abort`,`Join`,`Sleep`,`Interrupt`以及`Start`,这些都是在实际开发中频繁使用的功能。 1. **Start方法**: `Thread.Start`方法用于启动新创建的线程。当你创建了一个...

    javathread.part05.rar

    Java提供了丰富的线程控制方法,如`start()`启动线程,`sleep()`使线程暂停一段时间,`join()`让当前线程等待指定线程结束,`yield()`让当前线程让出CPU执行权,以及`interrupt()`中断线程等。 Java还提供了同步...

    javathread.part104.rar

    11. **Future和Callable接口**:这两个接口与`ExecutorService`配合使用,可以获取异步执行结果。 12. **线程中断**:通过`interrupt()`方法可以请求线程中断,但线程是否真正中断取决于其内部逻辑。线程可以通过...

    vxworks_kernel_programmers_guide_6.9

    PART I: CORE TECHNOLOGIES 1 Overview ...................................................................................................... 3 1.1 Introduction ............................................

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

    综上所述,理解和正确处理`Thread.interrupt()` 以及使用`LockSupport` 是编写高效并发代码的关键。良好的中断处理实践可以提高代码的可读性和可靠性,同时允许线程优雅地退出或取消任务,避免资源泄漏。在实际编程...

    [bugfix]重新理解Thread的InterruptedException

    通常的做法是重新抛出异常或者显式地调用`Thread.currentThread().interrupt()`。这样做的目的是确保后续代码可以检测到中断请求,特别是对于那些依赖于中断状态的高阶并发工具(如`ExecutorService`,`Future`等)...

Global site tag (gtag.js) - Google Analytics