如下代码片段:
Thread thread = new Thread(){
public void run(){
System.out.println("thread");
}
};
thread.start();
thread.interrupt();
System.out.println("end");
调用了interrupt方法却没有产生中断的原因:
对线程的interrupt是对线程处在sleep,wait,join状态的时候才起作用。InterruptException不interrupt()方法抛出的,interrupt()只改变线程的中断状态,sleep,wait,join的内部会不停的检查线程中断状态,如果它们检查到线程处于中断状态,就抛出异常中断线程。如果你的线程不处于这3个状态中,调用interrupt不会中断线程,或者说不会马上中断线程,如果后面的代码有让线程进入上面3个状态的其中一个,线程会马上抛出InterruptException而中断,因为你之前的interrupt()调用改变了线程的内部状态。
我们可以通过如下例子来来看效果:
Thread thread = new Thread(){
public void run(){
System.out.println("thread");//
try {
Thread.sleep(20000);
} catch (InterruptedException e) {//在主线程里主动调用中断,所以这里还没等睡够就会被叫起来,产生中断异常
e.printStackTrace();
}
}
};
thread.start();
thread.interrupt();//这里主线程会执行下来,而thread也会执行它自己的东西,这里将线程的中断状态改变,那么等到出遇到thread里的sleep时就会产生中断
System.out.println("end");
}
分享到:
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java 线程中的 interrupt,isInterrupt,interrupted 方法详解 在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将...
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频
一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频
在Java中,推荐使用`interrupt()`方法来请求线程中断,然后在线程的`run()`方法中检查`isInterrupted()`或`interrupted()`状态来决定是否退出循环。例如: ```java public class MyRunnable implements Runnable { ...
### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...
Thread.interrupt()方法的使用以及使用它退出线程
`interrupt()`方法是Java提供的用于中断线程执行的关键工具,但它的行为并非如许多人所理解的那样直接结束线程。下面是关于`interrupt()`方法以及线程中断机制的详细解析: 1. **线程的中断状态**: - 线程中断...
在上述示例中,`TestIsAlive`展示了如何使用`isAlive()`方法检查线程是否运行,而`TestInterrupt`演示了`sleep()`和`interrupt()`的用法。当`Thread.sleep()`被`interrupt()`打断时,`InterruptedException`会被抛出...
5. **Interrupt方法**: `Thread.Interrupt`方法用于中断处于`Sleep`、`WaitOne`或`Join`状态的线程。不同于`Abort`,`Interrupt`不会立即终止线程,而是发出一个信号,使线程有机会响应并清理资源。当线程在`Sleep...
- **interrupt()**:中断线程,标记线程的中断状态。 - **isInterrupted()和interrupted()**:检查线程是否被中断,前者是非静态方法,后者是静态方法。 4. **线程同步和通信**: - **synchronized**:用于控制...
2. **中断线程(Interrupt)** 3. **使用`ExecutorService`和`Future`** 其中,使用标志变量是最常见也最安全的方式之一,它允许线程自然退出其执行循环,避免了突然终止带来的副作用。 ### 使用标志变量停止线程 ...
在实际开发过程中,推荐使用`interrupt()`方法或`volatile`标志位来优雅地中止线程,这两种方法都能够保证线程的安全性和代码的优雅性。避免使用已废弃的`stop()`方法,因为它可能会导致线程不安全的问题。
挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...
在使用interrupt机制时,需要注意的是,interrupt方法并不像stop方法那样会中断一个正在运行的线程,而是设置一个中断标记,线程可以根据这个标记来判断是否应该被中断。 在实际应用中,interrupt机制可以用于控制...
- interrupt()方法用于中断线程,如果线程正在阻塞(如sleep或wait),会被中断并抛出InterruptedException。 通过这些技术,我们可以构建高效、稳定、响应迅速的多线程应用程序。在实际开发中,应根据具体需求...
总结以上所述,Java多线程之停止线程的方法实例代码详解可以使用退出标记、interrupt()方法和interrupted()方法来停止线程。使用退出标记停止线程简单易行,但需要对线程的执行过程进行控制。使用interrupt()方法和...
其它线程调用本线程的 interrupt() 方法时,会通过 checkAccess() 检查权限。这有可能抛出 SecurityException 异常。 如果本线程是处于阻塞状态:调用线程的 wait() , wait(long) 或 wait(long, int) 会让它进入...