Java 线程的终止与线程中断(2)


    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、如何终止线程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5c9ed1ffb6e7925ebcdeebf6da5b7d5b.html