public class Demo { /* * 线程中断相关方法 * ------------------------------------------------------------------------------ * interrupt() * 中断线程: * 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true。 * 中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。 * 线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop()方法那样会中断一个正在运行的线程。 * * interrupted()(static方法) * 判断是否是中断状态(会立即清除中断标示位): * 等同于currentThread().isInterrupted(true); * 该方法调用后会将中断标示位清除,即重新设置为false * * isInterrupted() * 判断是否是中断状态(不会立刻清除中断标示位): * 等同于isInterrupted(false); * 它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false * * isInterrupted(boolean ClearInterrupted) (private方法) * 测试某些线程是否被中断。 * 是否清除中断标示位,基于clearinterrupted是值传递。 * clearinterrupted为true时会立刻清除中断标示位,clearinterrupted为false时不会立刻清除中断标示位。 * * 多说无益,还是看例子来进行区别吧。 */ /** * interrupted()和isInterrupted()的区别 */ public static void main(String[] args) throws Exception { // 创建一个线程组 ThreadGroup threadGroup = new ThreadGroup("ThreadGroup1"); // 在该线程组下创建一个线程t1 Thread t1 = new Thread(threadGroup, new Runnable() { @Override public void run() { try { Thread.sleep(100000); // 100s } catch (InterruptedException e) { e.printStackTrace(); } } }, "Thread1"); // 启动线程 t1.start(); // 中断线程,会设置该线程的中断状态位为true。 t1.interrupt(); // 例子1,调用两次isInterrupted()方法 // System.out.println(t1.isInterrupted()); // true // System.out.println(t1.isInterrupted()); // false /* * 结论: * 第一次调用isInterrupted()方法的时候,中断标示位还没有被清除。 * 第二次调用isInterrupted()方法的时候,中断标示位已经被清除了。 * * isInterrupted()虽然不会【立刻】清除中断标示位,但是还是会清除中断标示位的。关键词:立刻 */ // 例子2,先调用interrupted()方法,再调用isInterrupted()方法 // System.out.println(t1.interrupted()); // false // System.out.println(t1.isInterrupted()); // false /* * 结论: * 第一次调用interrupted()方法的时候,中断标示位已经被清除了。 * 所以再调用isInterrupted()方法,返回的仍然是false。 * * interrupted()会【立刻】清除中断标示位。关键词:立刻 */ // 例子3,先调用isInterrupted()方法,再调用interrupted()方法 // System.out.println(t1.isInterrupted()); // true // System.out.println(t1.interrupted()); // false /* * 前两个例子已经有结论的。结果是吻合的。 */ // 例子4,调用两次interrupted()方法 // System.out.println(t1.interrupted()); // false // System.out.println(t1.interrupted()); // false /* * 前两个例子已经有结论的。结果是吻合的。 */ } }