zoukankan      html  css  js  c++  java
  • 线程终止的四种方式,interrupt 方法使用的简单介绍。

    一 正常结束。

    package com.aaa.threaddemo;
    /*
     一    终止线程的四种方式?
     *         程序运行结束,线程终止。    
     * 
     */
    public class ThreadTermination {
        public static void main(String[] args) {
            
            // 正常方式  把线程放入到thread中, 调用start方法。
            Thread thread  = new Thread(new Runnable() {
                public void run() {
                    System.out.println(111);
                }
            });
            
            thread.start();
        }
    
    }

    二  使用退出标志

    package com.aaa.threaddemo;
    /*
     一    终止线程的四种方式?
     *         程序运行结束,线程终止。
     *         
     *         使用退出标志,退出线程
     *             正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
     *             可以在外部设置一个条件,满足条件时才关闭线程。
     */
    public class ThreadTermination {
        public static void main(String[] args) throws InterruptedException {
            ThreadIf thread = new ThreadIf();
            
            thread.start();
            
            // 休息一会
            thread.sleep(2000);
            
            // 改变条件状态
            thread.exit = true;
            
            System.out.println("线程结束");
        }
    }
    
    class ThreadIf extends Thread{
        
        //volatile 关键字使exit同步,同一时刻,只有一个线程来修改exit。
        volatile boolean exit = false;
        
        @Override
        public void run() {
            // 条件是true 一直执行
            while (!exit) {
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    3 interrupt 方法

    package com.aaa.threaddemo;
    /*
     一    终止线程的四种方式?
     *     1.程序运行结束,线程终止。
     *         
     *     2.使用退出标志,退出线程。自定义条件。
     *             正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
     *             可以在外部设置一个条件,满足条件时才关闭线程。
     * 
     *  3.interrupt方法来中断线程,可以分为两种情况
     *        a 线程处于阻塞状态: 当线程使用了sleep    wait   socket中的receiver  ,accept等方法时。
     *          此时调用线程的interrupt方法,会抛出interruptException。 
     *          阻塞中的方法抛出异常,通过代码捕获,然后break跳出循环状态,才能正常结束run方法。
     *        
     *      b 线程是未阻塞状态, 使用isinterrupt 方法判断线程的中断标志来退出循环。
     *        使用interrupt方法,会把中断标志设置为true。
     *        和使用自定义标志来控制循环是一样的。  
     * 
     *    什么是中断?
     *        Java中用于停止线程的机制------中断。
     *        中断是一种协作机制,中断的过程需要程序员自己实现。调用interrupt方法也只是将标示设置为true。
     *        每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
     *        通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
     *
     *  为什么使用中断?
     *      在可能会发生的中断线程中,一直监听中断的状态,一旦发生了中断,就执行相关代码,进行处理。
     *      while(thread.isInterrupted()){  //没有中断,继续执行
     *          xxxxxx
     *      }
     *      
     *      // 发生中断了 需要的处理
     *          System.out.println("发生了中断,请处理。。。");
     * 
     */
    public class ThreadTermination {
        public static void main(String[] args) throws InterruptedException  {
            ThreadIf thread = new ThreadIf();
        
            //isInterrupted  判断调用者线程的中断标志  false or  true ,验证状态。
            if (thread.isInterrupted()) {
                System.out.println("当前的状态是false,不会输出本条语句");
            }
                
            thread.start();
    
    /*
             把中断的标志 设置为true ,通知线程应该中断了。
            此时线程是非阻塞状态,将会正常执行,不受影响。         
     */        
            thread.interrupt();
            
            //再次验证,此时已经中断 条件是true 可以输出语句。  使用while 就可以一直执行,和使用自定义的条件,是一样的效果。
            if (thread.isInterrupted()) {
                System.out.println("isInterrupted  判断调用者线程的中断标志  false or  true ,验证状态。 标识是true,输出本条语句");
            }
        
            
            //interrupted 方法有两个作用。会返回当前的中断状态,并且清除中断状态。 会把true,变为false
            boolean b = thread.interrupted();
            
            if (!b) {
                System.out.println("interrupted() 会返回当前的中断状态,并且清除中断状态。 会把true,变为false ");
            }  
        }
    }
    
    class ThreadIf extends Thread{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

     四  stop

    package com.aaa.threaddemo;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    /*
     一    终止线程的四种方式?
     *     1.程序运行结束,线程终止。
     *         
     *     2.使用退出标志,退出线程。自定义条件。
     *             正常而言,线程执行完run方法,就会结束。但是有些线程是服务线程,需要长时间运行。
     *             可以在外部设置一个条件,满足条件时才关闭线程。
     * 
     *  3.interrupt方法来中断线程,可以分为两种情况
     *        a 线程处于阻塞状态: 当线程使用了sleep    wait   socket中的receiver  ,accept等方法时。
     *          此时调用线程的interrupt方法,会抛出interruptException。 
     *          阻塞中的方法抛出异常,通过代码捕获,然后break跳出循环状态,才能正常结束run方法。
     *        
     *      b 线程是未阻塞状态, 使用isinterrupt 方法判断线程的中断标志来退出循环。
     *        使用interrupt方法,会把中断标志设置为true。
     *        和使用自定义标志来控制循环是一样的。  
     * 
     *    什么是中断?
     *        Java中用于停止线程的机制------中断。
     *        中断是一种协作机制,中断的过程需要程序员自己实现。调用interrupt方法也只是将标示设置为true。
     *        每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;
     *        通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。
     *
     *  为什么使用中断?
     *      在可能会发生的中断线程中,一直监听中断的状态,一旦发生了中断,就执行相关代码,进行处理。
     *      while(thread.isInterrupted()){  //没有中断,继续执行
     *          xxxxxx
     *      }
     *      
     *      // 发生中断了 需要的处理
     *          System.out.println("发生了中断,请处理。。。");
     *      
     *  4 stop 暴力终止线程。  释放锁,容易造成数据的不一致。
     *      直接将线程强行终止,已经是过期作废的方法。这个方法是不安全的,不推荐使用。
     *    
     *    不安全的原因?
     *        调用stop 方法后,创建子线程的线程会抛出错误,会把子线程的所有锁释放,
     *      一般任何进行加锁的代码快,都是为了保证数据的一致性。
     *      如果使用stop方法导致,子线程释放了所有锁,被保护的数据就会不一致。
     * 
     */
  • 相关阅读:
    Hdu 1257最少拦截系统
    删除mysql__转
    sql 入门的小例子熟悉一下_这可是一个转转转贴 :)
    header 用法_转
    java_json 转换 文件在file中
    javascript_php 正则匹配 转
    mysql 忘记密码转_kinghu
    php 通用下载
    明天就是新年开始
    翻译 有助于程序命名
  • 原文地址:https://www.cnblogs.com/ZXF6/p/14086084.html
Copyright © 2011-2022 走看看