今天看到一个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()方法的使用以及使用它退出线程
自.NET 2.0以来,Thread.Suspend()与Thread.Resume()方法已过时,VS提示可以使用如Monitor等技术,但是对于刚接触...相关技术参考:http://msdn.microsoft.com/zh-cn/library/system.threading.thread.interrupt.aspx
`Thread.interrupt` 方法是一个比较安全的替代方案,它会设置线程的中断状态,并且许多阻塞方法(如 `Thread.sleep`, `Object.wait`)在被中断时会抛出 `InterruptedException`,使得线程可以捕获这个异常并进行必要...
取而代之的是使用中断机制,这个机制主要通过`interrupt()`, `isInterrupted()`, 和 `interrupted()`三个方法来实现。 1. `interrupt()`方法:这个方法是用来设置目标线程的中断状态。当你在一个线程上调用另一个...
Java推荐使用更安全的中断机制,即通过`Thread.interrupt()`方法向线程发送中断信号,然后在线程的run方法中定期检查`isInterrupted()`或`interrupted()`状态来优雅地停止线程。这种方式允许线程清理资源并正常退出...
需要注意的是,在使用interrupt机制时,需要注意线程的中断状态位的变化,避免使用Thread.interrupted()方法来判断线程是否被中断,因为该方法调用后会将中断标示位清除,即重新设置为false。 Java线程Thread之...
- Thread.getThreadGroup()获取线程所属的线程组,Thread.interrupt()和Thread.currentThread().interrupted()分别用于中断和检查当前线程是否被中断。 10. **线程的等待/通知机制** - 使用wait()、notify()、...
总结来说,中断Java线程的关键在于理解和使用`Thread.interrupt()`的正确方式,结合`volatile`共享变量来协调线程间的通信。通过这样的方法,可以确保线程在接收到中断请求后,安全地停止当前任务,而不是强制终止。...
// 或者使用 thread.interrupt(); 与 stop 变量配合使用 } } ``` 在这个例子中,线程会在每次循环迭代时检查`stop`变量和中断状态,一旦发现中断请求,就会退出循环并清理资源。这种方法比直接使用`Thread.stop`...
线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程应该尽快结束。线程需要定期检查中断状态,并...
在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...
- 使用`Thread.currentThread().getName()`获取当前线程名,便于调试。 这些知识点是Java线程编程的基础,理解并掌握它们对于开发高效的并发程序至关重要。`javathread.part04.rar`中的资料可能包含了上述部分或...
本示例着重讲解几个关键的线程方法,包括`Abort`,`Join`,`Sleep`,`Interrupt`以及`Start`,这些都是在实际开发中频繁使用的功能。 1. **Start方法**: `Thread.Start`方法用于启动新创建的线程。当你创建了一个...
Java提供了丰富的线程控制方法,如`start()`启动线程,`sleep()`使线程暂停一段时间,`join()`让当前线程等待指定线程结束,`yield()`让当前线程让出CPU执行权,以及`interrupt()`中断线程等。 Java还提供了同步...
11. **Future和Callable接口**:这两个接口与`ExecutorService`配合使用,可以获取异步执行结果。 12. **线程中断**:通过`interrupt()`方法可以请求线程中断,但线程是否真正中断取决于其内部逻辑。线程可以通过...
PART I: CORE TECHNOLOGIES 1 Overview ...................................................................................................... 3 1.1 Introduction ............................................
综上所述,理解和正确处理`Thread.interrupt()` 以及使用`LockSupport` 是编写高效并发代码的关键。良好的中断处理实践可以提高代码的可读性和可靠性,同时允许线程优雅地退出或取消任务,避免资源泄漏。在实际编程...
通常的做法是重新抛出异常或者显式地调用`Thread.currentThread().interrupt()`。这样做的目的是确保后续代码可以检测到中断请求,特别是对于那些依赖于中断状态的高阶并发工具(如`ExecutorService`,`Future`等)...
public class ThreadInterrupt extends Thread { public void run() { try { Thread.sleep(50000); } catch (InterruptedException e) { System.out.println(e.getMessage()); } } // ... } ``` 在这个...