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线程阻塞停止") ;
                }
            }
        }
    }

}

 

posted on 2013-06-02 00:28  精灵July  阅读(302)  评论(0编辑  收藏  举报

导航