博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Thread对象的suspend,resume,stop方法
阅读量:6544 次
发布时间:2019-06-24

本文共 2160 字,大约阅读时间需要 7 分钟。

hot3.png

一、作用

    对于老式得磁带录音机,上面都会有,暂停,继续,停止。Thread中suspend,resume,stop方法就类似。

    suspend,使线程暂停,但是不会释放类似锁这样的资源。

    resume,使线程恢复,如果之前没有使用suspend暂停线程,则不起作用。

    stop,停止当前线程。不会保证释放当前线程占有的资源。

二、代码

public static void main(String[] args) {    Thread thread = new Thread(new Runnable() {        @Override        public void run() {            for (int i = 0; i <= 10000; i ++) {                System.out.println(i);                try {                    TimeUnit.SECONDS.sleep(1);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    });    thread.start();    try {        TimeUnit.SECONDS.sleep(5);    } catch (InterruptedException e) {        e.printStackTrace();    }    thread.suspend();                       //注释1    try {        TimeUnit.SECONDS.sleep(5);    } catch (InterruptedException e) {        e.printStackTrace();    }    thread.resume();                        //注释2    try {        TimeUnit.SECONDS.sleep(5);    } catch (InterruptedException e) {        e.printStackTrace();    }    thread.stop();                        //注释3    System.out.println("main end..");}

    代码中注释1的地方,线程会暂停输出,直到注释2处才恢复运行,到了注释3的地方,线程就被终止了。

    suspend,resume,stop这样的方法都被标注为过期方法,因为其不会保证释放资源,容易产生死锁,所以不建议使用。

三、如何安全的暂停一个线程

使用一个volatile修饰的boolean类型的标志在循环的时候判断是否已经停止。

public class Test {    public static void main(String[] args) {        Task task = new Task();        new Thread(task).start();        try {            TimeUnit.SECONDS.sleep(5);        } catch (InterruptedException e) {            e.printStackTrace();        }        task.stop();        System.out.println("main end...");    }    static class Task implements Runnable {        static volatile boolean stop = false;        public void stop() {            stop = true;        }        @Override        public void run() {            int i = 0;            while (!stop) {                System.out.println(i++);                try {                    TimeUnit.SECONDS.sleep(1);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

    

转载于:https://my.oschina.net/u/2250599/blog/617312

你可能感兴趣的文章
理解网站并发量
查看>>
spring整合elasticsearch之环境搭建
查看>>
TensorFlow 架构与设计-编程模型【转】
查看>>
如何运行Struts2官网最新Demo?
查看>>
'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
查看>>
XDebug 教程
查看>>
js 去html 标签
查看>>
好久不见
查看>>
小tips:JS中的children和childNodes
查看>>
二叉树的遍历
查看>>
Oracle的FIXED_DATE参数
查看>>
NDK配置
查看>>
(转)@ContextConfiguration注解说明
查看>>
[置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)...
查看>>
Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用
查看>>
《http权威指南》阅读笔记(十)
查看>>
JQuery UI Widget Factory官方Demo
查看>>
Atlas揭秘 —— 绑定(Binding)
查看>>
install xcode_3.2.5_and_iOS_sdk_4.2 _final with mac lion10.7.3
查看>>
JavaScript权威指南(第6版)
查看>>