zoukankan      html  css  js  c++  java
  • Java停止线程的方法 interrupt方法解析

    解析下interrupt()方法,对于老鸟来说,新手遇到这样的问题简直笑而不语,

    估计你们上学的时候老师也说的不好,根本没有具体的解析,我那个java老师就是这样的,汗!------

    具体解析请看代码注释。。。。。。。

    /**
     * 停止线程的方法
     * @author aa
     *
     */
    public class ThreadInterrupt {
        
        private volatile static boolean stop = false;
    
        /**
         * @param args
         * @throws InterruptedException 
         */
        public static void main(String[] args) throws InterruptedException {
            // 线程启动
            Thread01 ti1 = new Thread01() ;
            ti1.start() ;
            
            // Main线程睡1秒
            Thread.sleep(1000) ;
            
            /**
             * 程序运行到这里,ti线程已经启动,而且ti线程正在阻塞状态,
             * 屏蔽掉stop方法,
             * 调用interrupt()方法让线程退出阻塞状态,调用该方法线程将会抛出一个中断异常,
             * InterruptedException,终结阻塞状态之后,接着线程继续运行
             * 如下你将会看到“线程阻塞终结之后输出”打印到控制台上
             * 
             * 总结:interrupt()是用来退出线程的阻塞状态,如果线程不是阻塞状态,
             * 调用该方法将不起任何作用,中文jdk说的是“中断线程”,从字面上理解会给人误导。(很怀疑是机器翻译)
             * wait(),join(),sleep()都会让线程阻塞
             */
            ti1.interrupt() ;
            
            System.out.println() ;
            
            // 线程启动
            /**
             * 正确停止线程的方法是设置共享变量,无论什么情况,线程的退出都是检查共享变量然后停止
             * 
             * 不考虑意外情况,
             * 这里ti2线程start()后,
             * Mian线程休眠2.5秒过后并设置stop为true,
             * 此时ti2线程也就刚好是阻塞状态,
             * 设置stop之后继续执行interrupt()方法,终止阻塞,
             * 线程继续运行,遇到stop==true,跳出while,线程停止
             */
            Thread02 ti2 = new Thread02() ;
            ti2.start() ;
            Thread.sleep(2500) ;
            stop = true ;
            ti2.interrupt() ;
            
            Thread.sleep(1000) ;
        }
        
        private static class Thread01 extends Thread {
            @Override
            public void run() {
                System.out.println("Thread01线程启动") ;
                try {
                    sleep(1000000) ; // 等待1000秒
                } catch (InterruptedException e) {
                    System.out.println("Thread01线程阻塞停止") ;
                }
                System.out.println("Thread01线程阻塞终结之后输出") ;
            }
        }
        
        private static class Thread02 extends Thread {
            @Override
            public void run() {
                System.out.println("Thread02线程启动") ;
                int i = 0 ;
                while(!stop) {
                    System.out.println(i++) ;
                    try {
                        Thread.sleep(1000) ;
                    } catch (InterruptedException e) {
                        System.out.println("Thread02线程阻塞停止") ;
                    }
                }
            }
        }
    
    }
  • 相关阅读:
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    deep-in-es6(二)
    jQuery插件--根据数据加载的进度动画案例
    shop--14.升级--本地账号注册,登录,修改密码
    shop--13.升级--Redis缓存技术
    JedisUtil工具类
    shop--12.升级--加密数据库明文密码
    shop--11.阿里云部署java网站与微信开发调试
    shop--10.店铺详情(后台+前端类似于shoplist)
    shop--10.店铺列表(前端)
  • 原文地址:https://www.cnblogs.com/jinglingJuly/p/3113412.html
Copyright © 2011-2022 走看看