周末闲来无事,看了一下关于java多线程的数,每次看都有新的收获。年纪大了,记忆力不怎么好,打算记下来每次的收获,方便以后随时复习。
1. interrupt(),interrupted()与isInterrupted()的区别
(1)interrupt()是对线程的一个中断操作
首先,interrupt()方法比较好理解,是对线程的一个中断操作,没有返回值。但实际上,改方法并不会终止一个正在运行的线程。调用interrupt()方法只是在调用线程中打了一个停止的标记,并不是真的停止线程。若要停止线程,需配合其他操作。
(2)interrupted()是一个静态方法,对运行该方法的线程起作用
interrupted()与isInterrupted()都是返回boolean状态,判断线程是否已终止。区别是前者是一个静态方法,只对运行改方法的线程起作用,可类比Thread.sleep方法;而后者不是静态方法,是对调用方起作用。
(3)interrupted()执行以后具有将状态标识置位false的功能
interrupted()执行以后具有状态置位的功能,也就是说,如果第一次调用Thread.interrupted()返回true,再调用一次改方法会返回false,因为状态被置位了。但isInterrupted()仅仅返回线程中断状态,并无置位功能。
2. 提前中断线程的方法
推荐:主动抛异常
throw new InterruptedException();
中断线程的方法很多,如直接return也是可以的。推荐使用主动抛异常的方法,原因主要是主动抛出异常中断状态可以继续向上抛出,业务逻辑若需要针对这种中断做相应处理就会比较方便。