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 , 因为中断状态会被清除
}
}

}


你可能感兴趣的:(interrupt,线程中断,旗标法)