Java Thrad中的stop等方法为什么会被废弃

1、stop被废弃的原因

其实stop方法天生就不安全,因为它在终止一个线程时会强制中断线程的执行,不管run方法是否执行完了,并且还会释放这个线程所持有的所有的锁对象。这一现象会被其它因为请求锁而阻塞的线程看到,使他们继续向下执行。这就会造成数据的不一致,我们还是拿银行转账作为例子,我们还是从A账户向B账户转账500元,我们之前讨论过,这一过程分为三步,第一步是从A账户中减去500元,假如到这时线程就被stop了,那么这个线程就会释放它所取得锁,然后其他的线程继续执行,这样A账户就莫名其妙的少了500元而B账户也没有收到钱。这就是stop方法的不安全性。

2、suspend被废弃的原因

suspend被弃用的原因是因为它会造成死锁。suspend方法和stop方法不一样,它不会破换对象和强制释放锁,相反它会一直保持对锁的占有,一直到其他的线程调用resume方法,它才能继续向下执行。

假如有A,B两个线程,A线程在获得某个锁之后被suspend阻塞,这时A不能继续执行,线程B在或者相同的锁之后才能调用resume方法将A唤醒,但是此时的锁被A占有,B不能继续执行,也就不能及时的唤醒A,此时A,B两个线程都不能继续向下执行而形成了死锁。这就是suspend被弃用的原因。

3、如何中断一个线程

(1)、自行决定线程何时退出
定义一个标记变量stopme,用于指示线程是否需要退出。当stopMe()被调用,代码检测到这个改动时,线程就退出了。

//线程内

volatile boolean stopme = false;

public void stopMe(){
	stope = true;
}

@Override
public void run(){
	while(true){
		if(stopme){
			System.out.println("exit by stop me");
			break;
		}
		//你要执行的代码
	}
}
//线程内

(2)、用线程中断
与方法一比中断的功能更强,比如在 wait()或sleep()中只能用中断。

//main方法内

volatile boolean stopme = false;

public void stopMe(){
	stope = true;
}
Thread t1 = new Thread(){
	@Override
	public void run(){
		while(true){
			if(Thread.currentThread().isInterrupted()){
				System.out.println("interrupted");
				break;
			}
			//你要执行的代码
			...
		}
	}
};
t1.start();
Thread.sleep(2000);
t1.interrupt();

//main方法内
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值