美文网首页
boy-learning-thread | 1.1.2 线程终止

boy-learning-thread | 1.1.2 线程终止

作者: BruceOuyang | 来源:发表于2019-10-23 01:14 被阅读0次

    不正确的线程终止 - stop() 方法

    stop: 终止线程,并且清除监视器锁的信息,但是可能导致线程安全问题,JDK不建议使用

    destroy:JDK未实现该方法

    api 示例

    public class Demo {
        public static void main(String [] args) {
            Thread thread = new Thread(() -> {
                System.out.print("hello world");
            });
            thread.stop();     
        }
    }
    

    正确的线程终止

    1、正确的线程终止 - interrupt() 方法

    如果目标线程在调用 Object class 的 wait()、wait(long) 或者 wait(long, int)方法、join()、join(long, int) 或 sleep(long, int) 方法时被阻塞,那么 interrupt 会生效,该线程的中断状态将被清除,抛出 InterruptedExecption 异常。

    如果目标线程是被 I/O 或者 NIO 中的 Channel 阻塞,同样,I/O 操作会被中断或者返回特殊异常值。达到终止线程的目的。

    如果以上条件都不满足,则会设置此线程的中断状态。

    api 示例

    public class Demo {
        public static void main(String [] args) {
            Thread thread = new Thread(() -> {
                System.out.print("hello world");
            });
            thread.interrupt();     
        }
    }
    

    2、正确的线程终止 - 标志位

    代码逻辑中,增加一个判断,用来控制线程执行的终止。

    为了避免线程可见性问题,一般用 volatile 修饰标志位成员变量,例如:

    public class Demo extends Thread {
        
        public volatile static boolean flag = true;
        
        public static void main(String [] args) throws InterruptedException {
            new Thread(() -> {
                try{
                    while(flag) {
                        System.out.println("running...");
                        Thread.sleep(1000L);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
            
            // 3秒后,将标志位修改为false,代表不在继续运行
            Thread.sleep(3000L);
            
            flag = false;
            
            System.out.println("stop running");
        }
    }
    

    相关文章

      网友评论

          本文标题:boy-learning-thread | 1.1.2 线程终止

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