Java multi-thread - the thread abort

Incorrect thread abort -Stop

Stop: abort the thread, and clear information monitor locks, but may lead to
thread-safety issues, JDK is not recommended.
Destroy: JDK not the way to achieve.

/**
 * @author simon
 */
public class StopThread extends Thread {
    private int i = 0, j = 0;
    @Override
    public void run() {
        synchronized (this) {
            // 增加同步锁,确保线程安全
            ++i;
            try {
                // 休眠10秒,模拟耗时操作
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ++j;
        }
    }
    /** * 打印i和j */
    public void print() {
        System.out.println("i=" + i + " j=" + j);
    }
}
/**
 * @author simon
 * 示例3 - 线程stop强制性中止,破坏线程安全的示例
 */
public class Demo {
    public static void main(String[] args) throws InterruptedException {
        StopThread thread = new StopThread();
        thread.start();
        // 休眠1秒,确保i变量自增成功
        Thread.sleep(1000);
        // 暂停线程
        thread.stop(); // 错误的终止
        //thread.interrupt(); // @正确终止
        while (thread.isAlive()) {
            // 确保线程已经终止
        } // 输出结果
        thread.print();
    }
}

Ideally: either increment success i = 1, j = 1, or increment failure i = 0, j = 0
real program execution results: i = 1, j = 0

There is no guarantee consistency of data synchronized block inside, undermining thread safety
stop direct method to stop thread

Right thread abort -interrupt

If the target thread calls the Object class of wait (), wait (long) or wait (long, int) method, join (), join (long, int) or sleep (long, int) is blocked when the method, then Interrupt will the entry into force of the thread's interrupt status will be cleared, throw InterruptedException exception.

If the target thread is blocked by I / O or NIO in the Channel, the same, I / O operations will be interrupted or special exception return value. The purpose of terminating the thread.

If the above conditions are not met, the interrupt status will be set up this thread.

After the Demo example, stop () into interrupt (), the final output is "i = 1 j = 1", the data is consistent.

The correct thread abort - Flag

/** 通过状态位来判断 */
public class Demo4 extends Thread {
  public volatile static boolean flag = true;

  public static void main(String[] args) throws InterruptedException {
    new Thread(() -> {
      try {
        while (flag) { // 判断是否运行
          System.out.println("程序运行中");
          Thread.sleep(1000L);
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }).start();
    // 3秒之后,将状态标志改为False,代表不继续运行
    Thread.sleep(3000L);
    flag = false;
    System.out.println("程序运行结束");
  }
}

Logic code above, a determination to increase, for controlling the suspension of a thread of execution.

Guess you like

Origin www.cnblogs.com/loveyous/p/11415833.html