线程之中断

下面我们用一段代码进行模拟这个事故发生

描述:这里读线程ReadObjectThread在读到ID和name不一致时候就会进行输出这些对象,而ChangeObjectThread总是会写入两个相同的ID和NAME值,我们代码最后使用的stop方法

package com.base.zhou.thread.pack2;


/**
 * @author zhou.moumou
 * @version 2018年5月7日 下午9:27:33
 * @description
 */
public class Thread_Stop {
public static User user = new User();


public static class User {
private int id;
private String name;


public int getId() {
return id;
}


public void setId(int id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public User() {
id = 0;
name = "0";
}


@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", id=" + id + '}';
}
}


public static class ChangeObjectThread extends Thread {
public void run() {
while (true) {
synchronized (user) {
int v = (int) (System.currentTimeMillis() / 1000);
user.setId(v);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
user.setName(v + "");
}
//让自己或者其他线程运行,并不是单纯的让给其他线程
Thread.yield();
}
}
}


public static class ReadObjectThread extends Thread {
public void run() {
while (true) {
synchronized (user) {
if (user.getId() != Integer.parseInt(user.getName())) {
System.out.println("不一致事故出现:"+user.toString());
}
}
Thread.yield();
}
}
}


public static void main(String args[]) throws InterruptedException {
new ReadObjectThread().start();
while (true) {
Thread thread = new ChangeObjectThread();
thread.start();
Thread.sleep(150);
thread.stop();
}
}

}

代码结果

分析一波;就是ChangeObjectThread 中当id设值之后,name没设值之前这个空档,如果调用stop方法,那么此ChangeObjectThread 对应的锁就会释放,那么读线程ReadObjectThread就可能读到最新的ID和上一次的旧NAME

解决方案1:在ChangeObjectThread 中增加新的stop方法newStop

解决方案二:使用Thread.interrupt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值