略坑的Thread.stop()

一,stop方法调用之后,线程的run不一定会立即结束

首先来看下stop方法的代码:

 @Deprecated
    public final synchronized void stop(Throwable obj) {
        if (obj == null)
            throw new NullPointerException();

        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            checkAccess();
            if ((this != Thread.currentThread()) ||
                (!(obj instanceof ThreadDeath))) {
                security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);
            }
        }
        // A zero status value corresponds to "NEW", it can't change to
        // not-NEW because we hold the lock.
        if (threadStatus != 0) {
            resume(); // Wake up thread if it was suspended; no-op otherwise
        }

        // The VM can handle all thread states
        stop0(obj);
    }

stop方法是一个同步方法,在执行时候,会抛出ThreadDeath异常

public class StopThreadTest {

    @Test
    public void stopTest() throws InterruptedException {

        Thread t = new someThread();
        t.start();
        Thread.sleep(7);
        t.stop();

    }

    class someThread extends Thread {

        public synchronized void run() {
            for (int i = 0; i < 1000000; i++) {
                System.out.println("i=" + i);//一直全部打印完
            }
            System.out.println("打印完成!!!");
        }
    }
}

     在我们自己的实现类里面,如果将run方法改为同步方法,那么即使使用时候,调用了stop方法,由于是同步操作,必须等待run方法全部结束之后,stop才会真正被调用。

二,可能会造成逻辑上的不连贯

如果run方法是个原子操作,当调用stop方法之后,run方法未完成之前,操作就终止了,立即释放该线程持有的所有资源,可是操作只进行了一部分,就造成了逻辑上的不连贯。

时间: 2025-01-31 10:55:00

略坑的Thread.stop()的相关文章

Android Studio踩坑记

拾起Android项目,需要使用Goolgle Play Services.顺应潮流换了Android Studio,开启了踩坑之旅. 尝试直接将Eclipse项目导入AS,结果根本没法用啊.正确的方法应该是升级ADT,在Eclipse下导出build.gradle然后再导入.但是升级的时间还不如直接新建项目把资源拷进去,同时也能了解一下AS默认的项目结构. 第一个遇到的问题是新建的项目没有assert和lib目录.java和res等资源都在src/main目录下,于是我将assets和libs

百度卫士界面功能使用介绍

百度卫士1.0 Beta版发布 和百度杀毒一样,百度卫士也做出了"永久免费.不骚扰用户.不胁迫用户.不偷窥用户隐私"几大承诺.百度卫士自我总结为"轻.快.智.净"四大特点,目标自然是直指业界一哥:360安全卫士. 百度卫士的自我总结:"轻.快.智.净" 下面马上为大家介绍百度卫士1.0 Beta版的各项功能. 1.百度卫士界面设计赏析 百度卫士的安装界面与百度杀毒相似,不同的是主色使用了浅蓝色(百度杀毒使用的是绿色),百度卫士的安装包体积不超过1

一次mapping field的修改过程

Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapping { "settings" : { "number_of_shards" : 20 }, "mappings" : { "client" : { "properties" : { "ip&quo

sql server 2008-欲使这组数据满足第3范式,则需创建多少张表?范式不是针对一张表而言的吗?

问题描述 欲使这组数据满足第3范式,则需创建多少张表?范式不是针对一张表而言的吗? 这张初始表是一组菜单数据,从左到右依次是序号.菜名.菜的主食.菜的种类. 我的理解是,范式是针对一张表而言的,而这道题要求把一张表分成好几张表,才能满足第3范式,这是怎么回事呢?点击图片左下方的"全部展开"可以看到全图.CSDN看图的这点设置略坑啊.别人还以为我只发了半张图. 解决方案 点击图片左下方的"全部展开"可以看到全图.CSDN看图的这点设置略坑啊.别人还以为我只发了半张图.

10个大坑,当你产品上架AppStore会遇到

相信大家一定非常「深恶痛疾」AppStore的一系列产品上架规则.每次产品上架,一定要折腾很久,让人蛋疼.所以特此发起本期沙龙,为大家带来一些经验. 闫国荣:以下是现在能记忆起,遇到的问题.大家对此有不清楚的地方可以提出来,我详细介绍下. 内容含敏感话题或对苹果不友好的信息(如苹果婊) 使用了友盟的统计SDK,获取了IDFA但是上传填写无广告 采用友盟IDFA的sdk,并用友盟的默认淘宝页面广告,被告知和产品内容不符(最近) App在itunes中和安装后显示不一致(最近) App内有检测更新(

IIS安装了.net framework 4.0/4.5 却找不到相应应用程序池

通常情况下是因为没注册造成的,有些安装包会自己帮你注册上有些不会,感觉略坑.也有可能跟操作系统有关系,我操作系统是Server 2008 注册方法:在计算机中点击 开始菜单–>运行 拷贝以下内容运行一下即可. C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/aspnet_regiis.exe -i 以上是 .net framework 4.0 的注册方式,其实 无论2.0 还是 4.0 还是4.5 只要到相应的目录注册下即可,如2.0的注册方式: c:

在Python中使用pngquant压缩png图片的教程_python

说到png图片压缩,可能很多人知道TinyPNG这个网站.但PS插件要钱(虽然有破解的),Developer API要连到他服务器去,不提网络传输速度,Key也是有每月限制的.          但是貌似tinyPNG是使用了来自于 pngquant 的技术,至少在 http://pngquant.org/ 中是如此声称的:TinyPNG and Kraken.io - on-line interfaces for pngquant.如果真是这样,我很想对TinyPNG说呵呵.后者是开源的,连首

云数据中心网络运维的苦与乐

前几年大家讲 SDN 比较多的是怎样利用控制器,像 OpenDayLight.ONOS 这些东西,其实在讲怎样做一个 Driver.怎样做控制.大概从去年开始,SDN 开始跨入应用的时代,现在大家更多地在讲实际要做的事情.应用场景是什么.由于大家对 SDN 有多种不同的理解,在本文中我想把话题聚焦一下,落到云数据中心的网络运维这个点上,分享一些运维中的实际例子.没有大的篇章,只说说我们遇到的那些苦与乐. 因为本文话题的场景是云数据中心,所以我们有必要先看一下云数据中心里面的网络是什么样子. 简单

DNF鬼泣刷图加点推荐 卡洛流NB加点推荐

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   DNF鬼泣NB刷图加点分享,在NB改版之后,鬼泣的主流刷图路线依然是卡洛流,争议的地方其实在于阵的取舍,本文详解的讲解了现版本鬼泣加点该注意的事项 ,并分享了现版本的刷图装备推荐,一起来学习下吧! dnf鬼泣NB改版刷图加点分析:LZ目前走卡洛流,所以着重讲解,阵鬼流和鬼闪没啥变化,阵鬼不过需要夜叉9件套.好了不多说了,先上鬼泣加点模版吧!   单独说TP把,T