您的位置:首页 > 编程语言 > Java开发

【java】 java 中stop方法终止线程的不良后果

2015-12-29 16:18 357 查看
stop()方法属于暴力终止线程的方法,有诸多隐患已经被废弃了。

下面演示的是stop方法会释放锁,造成数据不一致的问题。

package com.xwolf.java.thread;

/**
* Created by Administrator on 2015/12/29 0029.
*/
public class SynUser {

private String name="Jack" ;
private String pwd="12345";

public String getName() {
return name;
}

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

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

synchronized  public void printUser(String name,String pwd){
this.name=name;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.pwd=pwd;
}

}


测试类:

package com.xwolf.java.thread;

/**
* Created by Administrator on 2015/12/29 0029.
*/
public class StopThreadReleaseLock extends  Thread {

private SynUser synUser;
public StopThreadReleaseLock(SynUser user){
this.synUser=user;
}

@Override
public void run() {
synUser.printUser("Suse","linux");
}

public static void main(String[] args){
SynUser user = new SynUser();
StopThreadReleaseLock lock = new StopThreadReleaseLock(user);
lock.start();
try {
Thread.sleep(300);
lock.stop();
System.out.println(user.getName()+","+user.getPwd());//Suse,12345
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


可见,控制台输出的并非预期的结果。

在java中终止线程的替换方法是使用interrupt方法和return结束线程.

package com.xwolf.java.thread;

/**
* Created by Administrator on 2015/12/29 0029.
*
* 终止线程的方法
*/
public class StopThread extends  Thread {

@Override
public void run() {
for (int i = 0; i < 100; i++) {

System.out.println(i);
//当前线程是否中断
if (this.isInterrupted()) {
System.out.println("当前线程停止了," + i);
return;
}
}
}

public static  void main(String[] args){
StopThread stopThread = new StopThread();
stopThread.start();
stopThread.interrupt();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: