Java 复习 —— 多线程中断

1、interrupt中断线程

1、interrupt 会给wait池中的线程抛出异常,这个时候该线程会被唤醒,但是同样还要继续竞争锁资源,才能继续运行!

2、interrupt 会给正在sleep的线程抛出异常,但是不会给yield线程抛出异常,个人感觉是因为sleep是指定多长时间阻塞,但是yield的确是不知道至少多长时间阻塞,另外yield这个方法只在测试使用,开发当中少用。

3、如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

4、中断状态:就是线程是否有被中断的一种标识,仅仅是一种标识!通过以下方法可以查看线程运行过程的中断状态,

1)interrupted :这是一个静态方法,而且这个方法返回了当前线程的中断状态之后,立刻就会修改这个状态为没有被中断的状态,换句话说如果当前线程被中断了调用这个方法之后返回的是true,再次调用这个方法返回就是false!另外,这是一个静态方法(还是返回当前线程的状态),所以不是很建议使用!

2)isInterrupted:返回当前的线程的中断状态,不会去修改这个状态。

在第三点中说道如果抛出异常中断状态将会被清除,也就是线程如果这个时候中断会抛出中断异常,但是中断状态为false,也就是从未中断!

2、正确中断线程

0)其他中断方式,比如sleep,yield,join,stop,suspend 等方式应该都不是真正项目中所需要的线程中断!

1)很明显如果以为可以通过interrupt来中断线程,那是不可能的,原因是这个方法只是修改一下这个线程的中断状态,或者可能发生中断异常。

2)旗标法中断线程,一般中断线程都是我们自己通过旗标法中断,如下代码

public void run(){

	while(flag){

		// some codes
		// 在某个条件下修改 flag = false 后者 在外界修改这个flag的值 
	}

}

public void run(){

while( isInterrupted() || flag){

// some codes			// change flag = false		try{		    // 阻塞代码		} catch(InterruptedException e){		    // 异常处理 切记 修改 flag = false , 因为中断状态会被清除		}	}

}
时间: 2024-08-30 01:20:08

Java 复习 —— 多线程中断的相关文章

java复习-多线程

和线程之间的关系: 进程:进程是程序的一次动态执行过程,他经理了代码加载,执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程. 线程:线程是实现并发机制的一种有效手段,进程和线程一样,都是实现并发的一个基本单元. java中多线程实现: 集成Thread和实现runnable 通过线程类的start方法来并发执行线程里面的线程主体内容. Runnable线程的执行方式如下: Thread是Runnable接口的子类. Thread类与Runnable接口的区别: 1

Java 复习 —— 多线程同步

1.问题引出 在多线程环境中,可能有多个线程同时访问一个有限的资源(资源共享),为了避免资源访问.操作混乱,所以出现了锁的机制!合理控制资源的操作(读与写)权限. 2.了解几个概念 1)获取CPU资源:线程想要执行必须得到CPU资源,这是一个必要条件!然而资源的调度是操作系统根据线程的优先级.线程资源的使用等因素来确定的.不需要深究,只要知道线程想要运行必须要获取到CPU资源,这是一个门槛.我们总是纠结Thread 的 sleep.yield.start 之后到底什么时候运行,其实就是CPU资源

Java 复习 —— 多线程基础

1.基本概念 1)进程:运行当中的程序,程序是静止的概念,进程的是动态的概念,进程与进程之间互不运影响 2)线程:指程序中单独顺序的流控制,线程依附于进程中,他是最小的执行单位!一个任务一个线程. 3)多线程:指的是单个程序中可以同时运行多个不同的线程,执行不同的任务.(本身就要把线程理解为为不同的任务而服务的) 4)二者关系:一个进程当中可以有一个或多个线程,但是至少有一个线程. 2.作用与关系 1)多线程的目的:最大限度利用CPU资源 2)主线程:Java程序默认启动一个线程就是main线程

[Java复习] 多线程 并发 JUC 补充

线程安全问题? 当多个线程共享同一个全局变量,做写的操作时,可能会受到其他线程的干扰.读不会发生线程安全问题. --  Java内存模型. 非静态同步方法使用什么锁? this锁 静态同步方法使用什么锁? 当前类的字节码文件 什么是ThreadLocal? ThreadLocal是给每个线程提供局部变量,每个线程可独立改变自己的副本,不会影响其他线程所对应的副本,解决线程安全问题. ThreadLocal底层原理是map集合. ThreadLocal内存泄漏问题? 由于ThreadLocalMa

Java复习——多线程与并发库

开启一个线程 实现一个线程的方式有两种:继承Thread类.实现Runnable接口.这两种方法都需要重写Run方法,具体的线程逻辑代码写在Run方法中.其实Thread类就实现了Runnable接口,但是并没有什么说法是使用哪种方式存在效率高低的问题,推荐使用实现Runnable接口的方式,因为更加面向对象,而且实现一个接口比继承一个类更灵活.我们可以使用匿名内部类的方式很方便的开启一个线程(使用Tread类的start方法开启一个线程): Thread : new Thread(){ pub

Java高级复习㈠ 多线程

1.线程 也称为轻量级进程,每个线程有自己的堆栈.程序计数器.局部变量.与进程相比,进程中的线程之间隔离程度要小 2.Java实现 ①implements Runnable ②extends Thread 一般推荐① 3.sleep().yield() sleep()方法对当前线程操作,指定以毫秒为单位的线程最小休眠时间,除非线程因中断提早恢复执行,否则不会在这段时间前恢复执行.线程可调用另一线程的interrupt()方法,向暂停的线程发出InterruptedException,变相唤醒暂停

Java基础--多线程的方方面面

1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 6,线程的优化有哪些方法? 1,什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2,什么是多线程?为什么设计多线程? 介绍之前,我们需要理解并行和并发的定义: 并行:同一个时刻有多

Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它.比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰,见代码 /* Java thread status for tools, * initialized to indicate thread 'not yet started' */   p

Java入门——多线程(二)

Java入门——多线程(二) 线程的状态 要想实现多线程,必须在主线程中创建新的线程对象.任何线程一般具有5种状态. 创建状态:用构造方法创建一个线程对象之后,新的线程就处于该状态.已经有了相应的内存空间和其他资源和其他资源. 就绪状态:线程进入线程队列排队,等待CPU服务. 运行状态:CPU处理,自动调用run()方法. 阻塞状态:就是在执行过程中暂时挂起.原因有:人为挂起,CPU的决定,sleep(),suspend(),wait()等方法.只有当引起阻塞的原因被消除后,线程才能转入就绪状态