static class Thread_writer implements Runnable{
private boolean flag=false;
public void setFlag(boolean flag){
this.flag=flag;
}
@Override
public void run() {
while(!flag){
synchronized (student){//对共享资源加锁,使读写分离互不影响,维护对象的一致性
int mm=new Random().nextInt(10);
student.setId(mm);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
student.setName(String.valueOf(mm));
}
Thread.yield();//释放cup执行权
}
}
}
二、线程的中断
在上面我们发现使用stop终止线程会照成数据一致性问题,于是我们通过控制标识来控制线程的终止,那JDK有没有合适的终止线程的方式呢?那就就是“线程中断”
线程中断就是让目标线程停止执行,但它不会使线程立即终止,而是给线程发送一个通知,告诉线程jvm希望你退出执行,至于目标线程何时退出,则完全由它自己决定(如果立即停止,会造成与stop一样的问题)。
JDK中线程中断相关的三个方法:
//线程中断
public void interrupt(){}
//判断线程是否中断
public boolean isInterrupted() {}
//判断线程是否中断,并清除当前中断状态
public static boolean interrupted(){}
1、使用线程中断就一定会中断线程吗?
public class InterruptTest {
public static void main(String[] args) {
Thread thread=new Thread(){
@Override
public void run() {
while(true){
System.out.println("========true======");
}
}
};
thread.start();
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();//调用线程中断方法
}
}
运行该代码发现该线程并没有终止。
2、如何终止线程