精华内容
下载资源
问答
  • java停止线程的方法

    2018-09-13 11:19:08
    java停止正在运行的线程的办法,自从stop方法过时之后,就剩下一个interrupt。但是这个interrupt是“尝试”打断线程,如果线程正在运行,它只是给线程置一个状态,线程周期性的判断状态退出;如果线程正在sleep、...

    java停止正在运行的线程的办法,自从stop方法过时之后,就剩下一个interrupt。但是这个interrupt是“尝试”打断线程,如果线程正在运行,它只是给线程置一个状态,线程周期性的判断状态退出;如果线程正在sleep、wait等,线程会被打断,并抛出一个异常。

    也就是说终止正在运行的线程是有可能的,但一个问题是如果调用到这个interrupt,这个interrupt一般是外界的一个动作(比如点击一个停止按钮)触发的。

    可以有两个办法:一是线程启动前用变量保持线程的引用,进而可以调用线程的终端方法。二是可以使用线程池,要有一个管理类持有和管理线程池,调用线程池的关闭方法shutdownNow,进而间接调用线程的中断方法。但是线程池一般是需要长期存活使用的,不能因为一次终止线程导致线程池不可用,所以每次使用线程池记得检查状态,如果关闭了就需要重新初始化线程池,初始化时还需要注意线程安全问题。

    以上两个是直接停止线程的办法,还有一个类似的办法,就是使用信号量,当需要停止线程时给一个volatile静态变量置值,线程周期性的检查此值退出。不过还是建议使用interrupt方法,个人认为自己的实现效率可能没有jdk类库的效率高,尚未验证。

    展开全文
  • 解析下interrupt()方法,对于老鸟来说,新手遇到这样的问题简直笑而不语, 估计你们上学的时候老师也说的不好,根本没有... * 停止线程的方法 * @author aa * */ public class ThreadInterrupt { pr...

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

     

    转载于:https://www.cnblogs.com/jinglingJuly/archive/2013/06/02/3113412.html

    展开全文
  • 主要介绍了java多线程之停止线程的方法实例代码详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了java安全停止线程的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java中线程的几种状态和停止线程的方法 1.线程的状态图需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态2.停止线程的两种方法1)自然停止:线程体自然执行完毕2)外部干涉:...

    java中线程的几种状态和停止线程的方法

    1.线程的状态图

    QQ截图20181226161353

    需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态


    2.停止线程的两种方法

    1)自然停止:线程体自然执行完毕

    2)外部干涉:通过线程体标识

      1.线程类中定义线程体能够使用的标识

      2.线程体使用该标识

      3.提供对外的方法改变该标识

      4.外部根据条件调用该方法即可

    ThreadStop.java:

    注意:代理类系统自动提供的stop方法不要使用,要用stop的话,自己在线程类里面写一个,因为代理类系统自动提供的stop已经过时,存在不安全性问题


    posted @ 2018-12-26 16:43 Y先森0.0 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 最近在学习Java的线程技术,发现interrupt()方法的并不能中断线程,然后对相关资料进行了查阅。

    最近在学习Java的多线程技术,发现interrupt()方法的并不能中断线程,代码如下:

    public class MyThread extends Thread {
        @Override
        public void run() {
            for(int i = 0; i <= 500000; i++) {
                System.out.println(i);
            }
        }   
    }
    public class Run {
        public static void main(String[] args){
            try {
                Thread t = new MyThread();
                t.start();
                t.interrupt();
            } catch (Exception e) { 
            }       
        }
    }
    

    运行结果
    这里写图片描述
    i最终加到了500000,说明interrupt()方法没有真正中断线程

    这里用《Java多线程编程核心技术》的说法

    调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程



    接下来我们进入正题,说说停止线程的方法
    1#用stop()方法来强制停止线程,但这种方法会引起许多安全性问题,已被废弃,这里不详细讲解。

    2#用抛出异常的方法来停止线程
    代码如下:

    public class MyThread extends Thread {
        @Override
        public void run() {
            try {
                for(int i = 0; i <= 500000; i++) {
                    if(this.isInterrupted()) {  //判断线程是否有中断标志
                        System.out.println("抛出异常了!");
                        throw new InterruptedException();
                    }
                    System.out.println(i);
                }           
            } catch (Exception e) {
                System.out.println("进入catch了!");
            }
        }   
    }
    public class Run {
        public static void main(String[] args){
            try {
                Thread t = new MyThread();
                t.start();
                Thread.sleep(2000); //main线程休眠2秒
                t.interrupt();
            } catch (Exception e) { 
            }       
        }
    }

    运行结果:
    这里写图片描述

    3#用return来停止线程
    代码如下:

    public class MyThread extends Thread {
        @Override
        public void run() {
    
            for(int i = 0; i <= 500000; i++) {
                if(this.isInterrupted()) {
                    System.out.println("return了!");
                    return;
                }
                System.out.println(i);
            }
        }   
    }
    public class Run {
        public static void main(String[] args){
            try {
                Thread t = new MyThread();
                t.start();
                Thread.sleep(2000); //main线程休眠2秒
                t.interrupt();
            } catch (Exception e) { 
            }       
        }
    }

    运行结果:
    这里写图片描述

    在《Java多线程编程核心技术》一书中,作者是建议使用抛异常的方法来实现停止线程的,因为在catch块可以对异常的信息进行相关的处理,而且异常流能更好、更方便的控制程序的运行流程,不至于代码中出现很多个return;造成污染。

    展开全文
  • Java停止线程的四种方法

    千次阅读 2019-06-09 13:26:34
    一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态调用的,调用之后会...stop(): 暴力停止线程。已弃用。...
  • JAVA线程停止的方法

    2012-01-30 14:10:52
    JAVA线程停止的方法
  • 文章目录错误的停止线程的方法-- 使用stop代码示例关于stop的错误理论关于suspend与resume会带来的问题 错误的停止线程的方法-- 使用stop代码示例 public class StopThread implements Runnable{ /** * 模拟 五个...
  • Java 停止线程

    2021-01-12 03:25:24
    Java 停止线程 停止java线程有三种常见的方式: 使用退出标志,使线程正常退出,也就是run方法完成时后线程停止。 使用stop线程强行终止线程,但是不推荐这种暴力停止的方法,会导致很多难以估计的错误与异常,比如...
  • 主要介绍了Java中如何停止线程的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 一、暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法。对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式。或许有人会问,为什么不使用等待wait()或通知notify()?要...
  • 停止线程的方法有以下几种 1、异常法:通过抛出异常来跳出正在运行的线程,在catch块中可以将异常向上层抛出,线程的停止事件得以传播。 2、沉睡法:通过Thread.sleep()一个很长的时间,让线程抛出java.la...
  • Java线程停止的方法

    2017-09-13 11:24:00
    Java线程停止方式 可以调用stop()方法,但是该方法已经被停用,同时该... 可以调用interrupt()方法标记当前线程为停止状态,在线程中调用isInterrupted()方法,如果该方法返回true,进行停止线程操作(retur...
  • 测试当前线程是否已经中断,但会清除当前线程的中断状态,第二次调用会返回false. -------------------------------------------- this.isInterruputed():测试线程是否中断 测试当前线程是否已经是中断状态...
  • 文章目录volatile 可以线程中断的demovolatile 无法中断线程的demovolatile无法中断线程的错误原因分析修复停止线程的错误 volatile 可以线程中断的demo 主线程让子线程运行5s后进行中断的代码如下. 使用volatile...
  • 主要介绍了java通过共享变量结束run停止线程的方法,大家参考使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,463
精华内容 985
关键字:

java停止线程的方法

java 订阅