[color=blue]1、sleep方法与interrupt方法[/color]
假如线程A像下面这样,使用线程的sleep()方法暂停着.
[code]Thread.sleep(10000);[/code]这时候线程B,会执行下面的语句,要求B放弃等待操作.
[code]a.interrupt(); //a是线程A的实例[/code]
在这里使用的interrupt方法,是Thread类的实例方法.执行interrupt方法时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt方法.
当sleep中的线程被调用interrupt方法时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.
[color=blue]
2、wait方法与interrupt方法[/color]
当线程A以wait方法等待时,与sleep一样可以取消.使用interrupt方法,可以对wait中的线程传达"不用等notify了,从等待区出来"的意图.
线程B执行下面的语句后,与sleep时一样,线程A会抛出InterruptedException异常.
[code]a.interrupt();[/code]
当线程wait时,要小心锁定的问题.线程在进入等待区,会把锁定解除,当对wait中的线程调用interrupt时,会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.
[color=blue]
3、Join方法与interrupt方法[/color]
当线程以join方法等待其他线程结束时,一样可以使用interrupt方法取消之.因为调用join方法不需要获取锁定,故与sleep时一样,会马上跳到catch块里.
[color=blue]4、interrupt方法只是改变中断状态而已[/color]
线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
假如线程A像下面这样,使用线程的sleep()方法暂停着.
[code]Thread.sleep(10000);[/code]这时候线程B,会执行下面的语句,要求B放弃等待操作.
[code]a.interrupt(); //a是线程A的实例[/code]
在这里使用的interrupt方法,是Thread类的实例方法.执行interrupt方法时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt方法.
当sleep中的线程被调用interrupt方法时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程.
[color=blue]
2、wait方法与interrupt方法[/color]
当线程A以wait方法等待时,与sleep一样可以取消.使用interrupt方法,可以对wait中的线程传达"不用等notify了,从等待区出来"的意图.
线程B执行下面的语句后,与sleep时一样,线程A会抛出InterruptedException异常.
[code]a.interrupt();[/code]
当线程wait时,要小心锁定的问题.线程在进入等待区,会把锁定解除,当对wait中的线程调用interrupt时,会先重新获取锁定,再抛出异常.在获取锁定之前,是无法抛出异常的.
[color=blue]
3、Join方法与interrupt方法[/color]
当线程以join方法等待其他线程结束时,一样可以使用interrupt方法取消之.因为调用join方法不需要获取锁定,故与sleep时一样,会马上跳到catch块里.
[color=blue]4、interrupt方法只是改变中断状态而已[/color]
线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。