美文网首页
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 线程终止

    不正确的线程终止 - stop() 方法 stop: 终止线程,并且清除监视器锁的信息,但是可能导致线程安全问题,...

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

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

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

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

  • 多线程(三)

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

  • 1.1.2 线程状态

    6个状态的定义:java.lang.Thread.State New: 尚未启动的线程的线程状态。 Runnabl...

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

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

  • 线程终止

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

  • 线程终止

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

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

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

  • 两阶段终止模式

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

网友评论

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

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