二:线程终止

作者: 知耻而后勇_zjh | 来源:发表于2017-07-25 18:02 被阅读0次

在JDK中,为Thread 提供了一个stop() 方法, 使用stop()方法,就可以立即终止一个线程,但是stop()方法是一个废弃的方法.因为stop()方法过于暴力,有可能把执行到一半的线程强行终止,可能会引起数据不一致的问题.

package com.xyhj;

public class StopThreadUnsafe {
    public static User u = new User();

    public static class User{
        private int id;
        private int name;
        public User(){
            id = 0;
            name = 0;
        }

        public int getId() {
            return id;
        }

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

        public int getName() {
            return name;
        }

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

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

    public static class ChangeObjectThread extends Thread{

        volatile static boolean stopme = false;

        public static void stopMe(){
            stopme = true;
        }

        @Override
        public void run() {
            while (true){
                if (stopme){
                    System.out.println("Exit by stop me");
                    break;
                }
                //对象锁
                synchronized (u){
                    int v= (int)(System.currentTimeMillis()/100);
                    u.setId(v);

                        //模拟程序干一些其他的事
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    u.setName(v);

                }
                //暂停当前线程
                Thread.yield();
            }
        }
    }

    public static class ReadObjectThread extends Thread{
        @Override
        public void run() {
            while (true){
                synchronized (u){
                    if (u.getId() != u.getName()){
                        System.out.println(u.toString());
                    }
                }
                Thread.yield();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        new ReadObjectThread().start();
        while (true) {
            Thread t = new ChangeObjectThread();
            t.start();
            Thread.sleep(150);
            //change线程在某一刻强行退出,读线程开始读数据
            t.stop();
            //ChangeObjectThread.stopMe();
        }
    }

}

如果在写线程执行过程中,是正常执行过程,则会看到控制台打印的User对象的id和name应该是一致的,但是如果在写线程被强行stop()终止,则会出现下面情况

数据不一致.png

相关文章

  • 二:线程终止

    在JDK中,为Thread 提供了一个stop() 方法, 使用stop()方法,就可以立即终止一个线程,但是st...

  • 线程池(3)终止线程池原理

    终止线程池 一、终止线程池方法 1、 shutdown() 安全的终止线程池 2、 shutdownNow() 强...

  • 【多线程】——4.安全的终止线程

    安全的终止线程 线程正常执行结束,就会终止 除了正常结束外,还有什么方法终止? 设置线程终止标志 public c...

  • 多线程(三)

    线程终止 1.run方法正常退出,线程自然终止2.因为一个没有捕获的异常终止了run方法,线程意外终止 线程中断 ...

  • threading模块中join()和setDaemon()

    setDaemon():将该线程声明为守护线程setDaemon(True),子线程会随着父线程的终止而终止;否则...

  • 线程终止

    线程终止 通过 stop 终止 已被 jdk 弃用,它可能导致线程安全问题。 通过 interrupt 终止 推荐...

  • 线程终止

    通知终止 场景:在主线程中启动子线程,如何让主线程通知到子线程,从而让子线程终止

  • 多线程系列09-线程终止与线程中断

    线程终止:在Thread类中JDK给我们提供了一个终止线程的方法stop(); 该方法一经调用就会立即终止该线程,...

  • 两阶段终止模式

    一个线程执行完自己的任务,自己就会进入终止状态。但是如果使用一个线程T1,终止线程T2,如何优雅的终止线程。优雅指...

  • 线程中断和终止

    线程中断的定义:(我的理解)就是中断不同于终止,终止是将处于阻塞状态的线程终止,清理资源.通常中断的线程不在执行状...

网友评论

    本文标题:二:线程终止

    本文链接:https://www.haomeiwen.com/subject/mrhgkxtx.html