`
schy_hqh
  • 浏览: 556085 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(多线程)使用interrupt中断,强制将线程由冻结状态切换到阻塞状态

 
阅读更多

为什么要有中断技术

某些场景,需要强制结束处于冻结状态(sleep,wait)的线程时,立即改变其冻结状态,让其回到阻塞状态,待获取到CPU执行权后,在catch块中改变run()执行标记,实现将线程停止的目的。

 

interrupt 线程中断技术,实际上就是用强制的方式来改变线程的状态

 

将处于冻结状态的线程,由冻结状态--->阻塞状态

冻结状态:sleep(time),wait() ,没有执行资格,没有执行权

阻塞状态:具备执行资格,正等待CPU执行权

 

sleep(time) 必须待时间到才能醒,如果interrupt,则睡眠状态被清除,立即醒;

wait() 由notify()/notifyAll()来唤醒,如果interrupt,则等待状态被清除,不再等待

 

interruptedException异常

强制将处于冻结状态的线程改变为阻塞状态,使其具备CPU执行资格。

由于这个强制动作破坏了程序预期的执行过程,将抛出interruptedException异常。此时,就需要在catch到interruptedException时,重新对线程的运行环境进行设置。

 

 

===================================================================================

 

 

如何停止处于冻结状态的线程---使用中断技术

 

要让线程停止,即让run()执行结束。

通常设置标记来控制线程是否继续执行。

如果多线程都处于了冻结状态,则无法读取标记进行判断,此时就需要使用中断技术,强制解除其冻结状态,回到运行状态去读取新的标记值,达到结束线程的目的!

 

package com.gc.thread;


/**
 * 中断:
 * 	不是将线程停止,而是强制解除睡眠或等待状态的线程,将其状态切换到阻塞状态,具备执行资格
 *  当被分配到CPU执行权后,将继续执行catch-InterruptedException块中的代码,此处可以做一些控制:
 *  改变运行环境中的资源,让线程继续执行;
 *  改变标记,控制线程是否继续执行;
 *  其它...
 */
public class InterruptThread implements Runnable{
	
	boolean flag = true;
	
	public void changeFlag() {
		flag = false;
	}
	
	public void run() {
		synchronized(this) {
			while(flag) {
				try {
					System.out.println(Thread.currentThread().getName()+"---waiting");
					//线程处于wait状态,释放锁,让其它线程可以进入
					wait();
				} catch(InterruptedException e) {
					System.out.println(Thread.currentThread().getName()+"---interrupted");
					//线程被中断,回到阻塞状态,当其获得CPU执行权后,在此处改变多线程执行标记,将其停止!
					changeFlag();
				}
			}
			System.out.println(Thread.currentThread().getName()+"---"+"over!");
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		InterruptThread runnable = new InterruptThread();
		Thread t1 = new Thread(runnable);
		Thread t2 = new Thread(runnable);
		
		t1.start();
		t2.start();
		
		//让t1和t2都处于冻结状态
		Thread.sleep(10);
		
		t1.interrupt();//解除t1线程的冻结状态,此时t1线程抛出InterruptedException,由catch块捕获,对标记进行改变
		t2.interrupt();//解除t2线程的冻结状态,此时t2线程抛出InterruptedException,由catch块捕获,对标记进行改变
	}
}

 

 

 

分享到:
评论

相关推荐

    09.多线程编程基础-停止线程-使用interrupt方法中断线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

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

    对于I/O操作,如果线程在可中断通道(如`java.nio.channels.InterruptibleChannel`)上执行操作,中断会关闭通道并设置线程的中断状态,导致线程接收到`ClosedByInterruptException`。在`Selector`中,中断会导致...

    Java多线程笔记

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

    java线程中断之interrupt和stop.docx

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

    java线程中的interrupt,isInterrupt,interrupted方法

    interrupt 方法用于设置中断状态标志,isInterrupted 方法用于检查中断状态标志,而 interrupted 方法则可以同时获取上一次线程的中断标志值和清除中断状态标志。在使用这些方法时,需要小心处理中断状态标志的副...

    Java多线程机制(讲述java里面与多线程有关的函数)

    挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...

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

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

    Java多线程(二)、线程的生命周期和状态控制

    ### Java多线程之线程的生命周期和状态控制 #### 一、线程的生命周期 在Java中,线程的生命周期是指线程从创建到结束的整个过程。根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    interrupt中断

    处理器响应中断后,会保存当前任务的状态,跳转到预先定义的中断服务程序(ISR,Interrupt Service Routine)执行相应的操作,处理完事件后再恢复先前的任务,这就是中断的上下文切换。 在基于DSP的系统中,中断...

    多线程面试题

    9. **中断线程**:Thread类的interrupt()方法可以请求线程中断,但并不会立即停止线程,而是让线程在检查到中断标志后自行决定如何退出。 10. **守护线程(Daemon)**:守护线程是一种特殊的线程,当所有非守护线程...

    java 多线程并发实例

    Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...

    线程及多线程的详细讲解

    ### 线程及多线程的详细讲解 #### 一、线程的基本概念与程序、进程的关系 ...线程的状态转换体现了多线程编程中的复杂性和灵活性,正确地理解和管理这些状态对于开发高性能、健壮的多线程应用至关重要。

    多线程使用操作大全

    ### 多线程使用操作大全 #### 知识点概览 本文主要围绕多线程在Java中的使用展开,深入探讨了线程控制的基本方法及其应用场景,并提供了具体的示例代码来帮助理解。主要包括线程的生命状态检查、优先级管理、线程间...

    Java多线程练习题

    Thread类提供了interrupt()方法用于中断线程,但是需要注意的是,中断并不是立即停止线程,而是设置一个中断标志,线程需要在适当的地方检查这个标志并处理中断。 通过对以上知识点的深入理解和实践,开发者可以...

    java多线程Demo

    - interrupt()方法用于中断线程,如果线程正在阻塞(如sleep或wait),会被中断并抛出InterruptedException。 通过这些技术,我们可以构建高效、稳定、响应迅速的多线程应用程序。在实际开发中,应根据具体需求...

    Java多线程详解及示例

    Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后自行决定是否停止。守护线程(Daemon Thread)是一种特殊线程,当所有非守护线程结束时,守护...

    多线程demo程序-轻松掌握多线程技术

    - 使用Thread类的interrupt()方法:向线程发送中断信号,然后在run()方法中捕获InterruptedException并退出。 - 使用CountDownLatch或CyclicBarrier等并发工具类:在所有工作完成后,触发一个事件来结束线程。 5....

Global site tag (gtag.js) - Google Analytics