终止线程 stop()
stop()方法已经被作废,因为如果暴力让线程停止可能会使一些清理性的工作得不到完成。其次,可能会造成数据不一致的问题。
package com.Thread;
import java.util.concurrent.TimeUnit;
public class Thread_02_demo {
public static User u =new User();
public static class User{
private int id;
private String name;
public User(){
id=0;
name="0";
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static class ChangeObjectThread extends Thread{
@Override
public void run() {
while(true){
//同步锁 获取 u(User) 的锁
synchronized(u){
//获得系统的时间,单位为毫秒,转换为妙
int v = (int) (System.currentTimeMillis()/1000);
u.setId(v);
try{
//暂停
TimeUnit.MILLISECONDS.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
//基本数据型态转换成 String
u.setName(String.valueOf(v));
// System.out.println(u.name);
}
//暂停当前正在执行的线程对象,并执行其他线程
Thread.yield();
}
}
}
public static class ReadObjectThread extends Thread{
@Override
public void run() {
while (true){
synchronized (u){
//当用户名与用户ID 不一致 输出
if(u.getId()!=Integer.parseInt(u.getName())){
System.out.println(u.toString());
}
}
//暂停当前正在执行的线程对象,并执行其他线程
Thread.yield();
}
}
}
public static void main(String[] args) {
new ReadObjectThread().start();
while (true){
Thread t= new ChangeObjectThread();
t.start();
try{
Thread.sleep(150);
}catch (Exception e){
e.printStackTrace();
}
t.stop();
}
}
}
//输出结果
User{id=1623331046, name='1623331045'}
User{id=1623331046, name='1623331045'}
User{id=1623331046, name='1623331045'}
User{id=1623331046, name='1623331045'}
User{id=1623331047, name='1623331046'}
User{id=1623331047, name='1623331046'}
在正常情况下,user对象在ChangeObjectThread 中都应该保持id与name一致,而产生这一原因即使stop(),stop() 太过于暴力了,强制的将线程打断,同时对象一致性也被破坏,对象刚写入id值,就被打断了,而没有写入对应的那name值,而name值依旧是上一次的值,而导致id与name不一致被读取到输出。