不要调用 stop()或suspend()方法。

Winform美化框架AntdUI中Table的使用方法 使用核心注意点: 数据模型中属性名需要完全与new Column里的列名一致否则添加数据源则无法读取到详细内容。 阅读详情

在java doc里面可以看到stop suspend 已经被deprecated了。

因为stop会造成unsafe,而suspend会造成死锁。

那我们要怎么让一个线程stop。我们需要提供一个变量,以及一个用来设置这个变量的函数。如:

class Test extends Thread{

   private boolean stop;

  public void stopThread(){

     stop = true;

    }

public void run(){

  while (!stop){

  //do work

 }

 //clean up

}

}

这个方法的缺点是:

线程的终止有可能不情愿地推迟,当一个线程对另一个线程的调用stopThread, 线程2可能正在它的while循环内部进行一些任务,就不会及时查看它的stop变量。这项技术也有优点,线程还会继续执行,所以就能到达clean up,也就能进行写必要的清理工作了。

但是上述代码并不完全正确,问题在stop身上。当我们把stop变量设置为true,并不能保证run()内的代码看的见变化了的值,之所以存在这个问题是因为java允许线程在其私有专用内存中保留主内存的变量副本。这可以优化性能。在访问变量时,对私有内存的超作,性能大于主内存。

有两种方法可用确保变量的私有专用副本与其主内存内的版本一致:

1。在synchronized函数或synchronized区块中进行访问。

2。声明变量为volatile。

将变量声明为volatile,可迫使java运行层在每次访问变量时都对私有专用副本和主内存之间进行一致化。声明stop为volatile可以确保其值是最新的。

private volatile boolean stop;

stop ()suspend () 方法为何不推荐使用 stop() 方法可以立即终止一个线程的执行,但这会导致线程被突然中止,可能导致线程在执行到一半时被终止,导致资源没有得到正确释放。这可能会导致数据损坏、资源泄漏等严重问题,因此它被认为是不安全的。在终止线程时,应该允许线程完成其正在进行的操作,然后安全地退出。 阅读详情

相关推荐

K-BERT: Enabling Language Representation with Knowledge Graph 代码复现 直接运行

K-BERT: Enabling Language Representation with Knowledge Graph K-BERT K-BERT 代码复现

1042

关于Thread对象的suspend,resume,stop方法(已过时)

一、作用 对于老式的磁带录音机,上面都会有暂停,继续,停止。Threadsuspend,resume,stop方法就类似。 suspend,使线程暂停,但是不会释放类似锁这样的资源。 resume,使线程恢复,如果之前没有使用suspend暂停线程,则不起作用。 stop,停止当前线程。不会保证释放当前线程占有的资源。 二、代码 public static void main(String[] args) { Thread threa...

lgxzzz的博客 903

全国渔业统计年鉴1979-2025年-最新出炉.zip

一、资源特点全新力作:今年精心打造,人工细细打磨,品质上乘。权威精准:数据来源,准确靠谱,值得信赖。品质无忧:绝无数据造假,品质有保障,放心使用。二、适用人群学生:在校专科生、本科生、研究生,助力学业各个环节。教研人员:大学教师和学术科研工作者,为教学科研添力。三、适用专业社科经济:经济学、社会学专业适用。规划管理:地理学、城市规划,以及商业、工商管理专业皆可使用。[特别说明]相关资源数据已全部上传至网盘。由于纯手工分享粘贴链接和提取码,不排除有极少提取码者链接出现差错(内容与标题对不上),若遇到这种情况,不要着急,请私信博主,将会第一时间更正补链接!

java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()suspend()方法为何不推荐使用

有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此

sdf0823的专栏 1442

驱动中suspend函数是如何被调用到的。

1.电源管理相关文件在kernel/power目录下。 2.在suspend会轮询bus下的driver,然后一次调用到driver->pm->suspend方法,然后进入休眠。 3.state_store->pm_suspend->enter_state->suspend_devices_and_enter->dpm_suspend_start->dpm_suspend->devic

月出皎兮。 佼人僚兮。 舒窈纠兮。 劳心悄兮。 1万+

suspend方法 stop方法

调用suspend()方法之后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易死锁。同样stop()方法在终结一个线程时不会保证线程的资源正确释放,通常是没有给予线程完成资源释放工作的机会,会导致程序可能工作在不确定状态下。 转载于:https://www.cnblogs.com/xcyz/p/7900487.html...

weixin_30919571的博客 490

java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()suspend()方法为何不推荐使用

java5 以前, 有如下两种: 第一种: new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类的实例对象, 子类加上 run 方法后的代码如下: new Thread(){ public void run(){ } }.start(); 第二种: new T...

qq_41494853的博客 1093

java多线程stop()suspend() 方法为何不推荐使用

java多线程stop()suspend() 方法为何不推荐使用

java1234的博客 901

多线程你还在用stop()suspend()

stop()suspend() 方法为何不推荐使用 反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。 suspend() 方法容易发生死锁。调用suspend() 的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起" 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。

分享技术,享受生活 3452

stop()suspend() 方法为何不推荐使用

 反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用stop()方法,即使在同步块中,它也干脆地s

2495

线程之stop()、wait()suspend()、sleep()方法区别详解

一、sleep 当前线程由RUNNABLE状态的会进入TIMED_WAITING(超时等待); 超时等待过程中线程持有的锁并不会释放; 1、API Thread.sleep(long millis); // 单位:毫秒 Thread.sleep(long timeout, int nanos); // 毫秒,纳秒 TimeUnit.SECONDS.sleep(long timeout); // 这个时间单位可以优选,底层调用的其实还是Thread.sleep(ms, ns); 2、示例 pub

qq_42547338的博客 3405

stop()suspend()、resume() 弃用的原因(缺点)

根本原因:线程不安全,可能会出现数据不同步 一、stop() 方法 stop() 方法可以停止一个正在运行的线程,它会立即释放CPU资源和释放锁,是不安全的,可能会导致数据不同步和一些清理性的工作得不到完成,如:关闭文件,关闭连接等,这个方法Java中已废用。 使用 stop() 方法的存在的问题: 调用 stop() 方法时,会抛出 java.lang.ThreadDeath 异常,但在通常情况下,此异常不需要显式的捕获。 方法 stop() 已经被作废,因为如果强制让线程停止则可能会使一些清理性的工

Mrs_Yu的博客 2434

为何stop()suspend()方法不推荐使用

-------------纯属记录自己的学习生活-------------参考[1] 沈小默的博客, 为何stop()suspend()方法不推荐使用.

梦合九千的博客 4241

stop()suspend() 方法为何不推荐使用

http://blog.csdn.net/yakihappy/article/details/3979912 反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被

走马观花 3571

java实现线程的三种方式, stop()suspend()方法为何不推荐使用

文章目录1 线程的实现1.1 基础Thread类1.2 实现Runnable类1.3 线程池写法2 stopsuspend方法 1 线程的实现 java5以前,有如下两种: 有两种实现方法,分别使用new Thread()和newThread(runnable)形式,第一种直接调用thread的run方法,所以,我们往往使用Thread子类,即new SubThread()。第二种调用runna...

上善若泪 1216

Java中有几种方法可以实现一个线程??用什么关键字修饰同步方法??stop()suspend()方法为什么不推荐使用??

1. Java中有几种方法可以实现一个线程?? 两种,分别是继承thread类和实现Runnable类接口。 第一种: new Thread(){}.start();这表示调用Thread子类对象的run方法,new Thread(){}表示一个Thread的匿名子类的实例对象,子类加上run方法后代码如下: new Thread(){ public void run(){ } }.sta...

weixin_44415362的博客 1331

过期的suspend()、resume()stop()

大家对于CD机肯定不会陌生,如果把它播放音乐比作一个线程的运作,那么对音乐播放做出的暂停、恢复和停止操作对应在线程Thread的API就是suspend()、resume()stop()。注意 正因为suspend()、resume()stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法,而暂停和恢复操作可以用后面提到的等待/通知机制来替代。在代码清单4-8所示的例子中,创建了一个线程PrintThread,它以1秒的频率进行打印,而主线程对其进行暂停、恢复和停止操作。

wcg_jishuo的专栏 538

【七】Java多线程之线程暂停与终止,resume()suspend()stop()弃用,interrupt()简介

resume()suspend()stop(),这三个方法分别是重启线程、挂起线程、终止线程。 这三个方法已经弃用。 如果需要用到类似功能需要用flag来实现 public class StopThreadTest { public static void main(String[] args) { StopThread r1 = new StopThread(...

Sid小杰的博客 6249
上一篇: 不要对locked object(上锁对象)的object reference 重新赋值
下一篇: log4j sample
dengyin2000
博客等级 码龄24年 6粉丝 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值