zoukankan      html  css  js  c++  java
  • Thread线程中断相关方法

    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
            /*
             *    前两个例子已经有结论的。结果是吻合的。
             */
    
        }
    }
  • 相关阅读:
    作业要求 20201022-1 每周例行报告
    作业要求 20201015-3 每周例行报告
    20201008-1 每周例行报告
    20200924-1 每周例行报告
    总结
    20201126-1 每周例行报告
    20201120-1 每周例行报告
    20201112-1 每周例行报告
    20201105-1 每周例行报告
    20201029-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/zj0208/p/8081761.html
Copyright © 2011-2022 走看看