Java再学习——停止一个正在运行的线程

关于这个问题,先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()

首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了。我们只需瞧瞧suspend(), resume(), stop()这三个就行了;

suspend()——让当前线程暂停执行

resume()——让当前线程恢复执行

当调用suspend()的时候,线程并没有释放对象,因此当多线程的时候,如果其他线程要用到某个被suspend的线程占用的对象,就必须要等到它被resume()才可以,而这个过程就极易出现死锁。

所以,they are deprecated!

而stop()是最不应该的,因为你都不知道它的状态就stop()了,释放所有能释放的锁,而且如果run方法存在同步,还不一定能stop~正反方向,这个方法都不适合。

备注:对于废弃的方法本身了解就可以,更多还是要去分析废弃的原因,如果你喜欢进阶的话~

关于停止一个正在运行的线程,官方建议设置变量去关闭。形同如下:

public class APP {

    public static void main(String[] args) throws Exception {
        class MyThread extends Thread {
            boolean flag = true;

            @Override
            public void run() {
                while (flag) {
                    // do something
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("I‘m running!");
                }
                System.out.println("I‘m dead!");
            }

            public void stopThread() {
                flag = false;
            }
        }
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(3000);
        thread.stopThread();
    }
}

也就是通过设置变量来关闭线程,当然如果你就是执行完一次,那当然就没必要设置变量了,因为这种线程都没必要单独处理停止行为。

其次,这个所说是变量但是这个变量设置还是有很多巧妙的地方,比如下面这中类型:

public class APP {

    public static void main(String[] args) throws Exception {
        class MyThread extends Thread {
            boolean isRunning = true;

            @Override
            public void run() {
                while (isRunning) {
                    // do something
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println(e.getMessage());
                        isRunning = false;
                    }
                    System.out.println("I‘m running!");
                }
                System.out.println("I‘m dead!");
            }
        }
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
    }
}

基本就是这样操作了~

时间: 2024-12-21 00:28:24

Java再学习——停止一个正在运行的线程的相关文章

如何停止一个正在运行的java线程

与此问题相关的内容主要涉及三部分:已废弃的Thread.stop().迷惑的thread.interrupt系列.最佳实践Shared Variable. 已废弃的Thread.stop() @Deprecated public final void stop() { stop(new ThreadDeath()); } 如上是Hotspot JDK 7中的java.lang.Thread.stop()的代码,学习一下它的doc: 该方法天生是不安全的.使用thread.stop()停止一个线程

java如何正确停止一个线程

Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的interrupt()方中断阻塞,线程开始检查标志(PS:抛出异常不会退出循环) ------------------------------------------------------------我是copy分割线------------------------------------------

如何取消一个正在运行的线程

============问题描述============ 我现在想实现的功能是,点击左边9个按钮中的任一个,创建10个线程向服务器请求10张图片,我现在遇到的麻烦就是,当我快速而且连续随机点击左边的按钮时,那不是会创建几十甚至上百个线程啊(已测试,线程过多直接导致手机死掉了),而我只想要最后一次点击按钮请求的图片.大家帮我想想怎么办啊,我是该只创建一个线程请求完一张图片后,再去创建线程请求下一张,还是怎么办啊!我不知道怎么kill掉一个正在运行的线程,注:该线程无循环. 大家有什么好的思路都说说

如何安全的结束一个正在运行的线程

背景 java.lang.Thread类包含了一些常用的方法,如:start(), stop(), stop(Throwable) ,suspend(), destroy() ,resume().通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留. 在JDK帮助文档以及Sun公司的一篇文章<Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?>中都讲解了舍弃这些方法的原因.

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

如何中断一个正在运行的线程

有时候中断一个正在运行的线程是一个比较重要的应用,但是貌似也是比较困难的事情.假设我们正在用第三方支付软件进行支付,点击确定以后, 由于某些原因需要取消这次支付,貌似现在还没有哪家的支付软件能够实现这样的功能,因为这个实在太困难了.开启一个线程去进行支付功能后, 即使做了一个这样的中断这个线程的功能,这个功能也不能保证钱在没有支付的前提下,线程被扼杀. 因为在Java的语言层面上没有提供有保证性的能够安全的终止线程的方法.而是采用了一种协商的方式来对线程进行中断.interrupte()方法就是

Java再学习——随机面试题

1.final, finally, finalize的区别 final—是修饰符,可以修饰变量.方法和类. final类不能再派生出新的子类即不可当父类: final变量必须在声明时给定初值或在构造方法中赋值,在以后的引用中只能读取,不可修改. final方法不能重载. finally—在异常处理时提供 finally 块来执行收尾操作.如果抛出一个异常,那么相匹配的 catch 子句就会执行,而finally则是只要try代码块有执行(无论return与否),最后都会进入到 finally 块

Java再学习-JVM类加载和执行机制

  JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器

Java再学习——栈(stack)和堆(heap)

一.内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的