`
schy_hqh
  • 浏览: 563084 次
  • 性别: 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块捕获,对标记进行改变
	}
}

 

 

 

分享到:
评论

相关推荐

    多线程思维导图总结

    本文将深入探讨多线程的核心知识点,包括线程间的通信、生产者消费者问题以及如何处理冻结的线程。 一、线程间的通信 在多线程环境中,线程间通信是必不可少的,以确保数据的一致性和正确性。Java中提供了多种机制...

    思维导图-多线程进阶总结02

    本文将围绕“思维导图-多线程进阶总结02”的主题,深入探讨线程间的通信、生产者消费者问题以及如何处理冻结状态的线程。 一、线程间的通信 线程间通信是多线程编程中必不可少的一部分,它确保了共享资源的有效...

    多线程窗口暂停线程 并恢复

    4. **线程的Interrupt方法**:虽然不能直接暂停线程,但可以中断正在阻塞的线程,然后在线程的异常处理程序中进行恢复逻辑。 5. **线程池和Task类**:使用线程池或`Task`(异步编程模型的一部分)可以更方便地管理...

    Java多线程教程

    ### Java多线程教程知识点详解 ...然而,正确地使用多线程并非易事,需要考虑到线程安全性和同步等问题。希望开发者们能够通过实践不断深化对多线程的理解,并能够在实际项目中灵活运用多线程技术。

    java 多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。 1. **继承Thread类*...

    java编程——Java线程

    2. **利用多核处理器**:在多处理器系统中,使用多线程可以充分利用硬件资源,提高程序的执行效率。 3. **简化模型构建**:线程可以用来模拟现实世界中的并发事件,如模拟网络请求、数据库操作等,使得模型设计更加...

    Java 多线程使用要点分析

    本文将深入探讨Java多线程使用过程中的关键点。 1. 线程状态与控制 - 线程的生命周期包括新建、可运行、运行、阻塞和死亡五种状态。Java提供了多种方法来控制线程的行为,如sleep()、wait()、notify()和notifyAll...

Global site tag (gtag.js) - Google Analytics