函数有嵌套的情况下如何停止线程?

发布于 2022-09-11 22:21:00 字数 519 浏览 23 评论 0

函数有嵌套的情况下如何停止线程

void thread_start(){
    new Thread(){
        public void run(){
            callMethod1();
            callMethod2();
            callMethod3();
            callMethod4();
            callMethod5();
            callMethod6();
        }
    }.start();
} 
void callMethod5(){
    foo1();
    foo2();
    foo3();
    foo4();
    foo5();
    ...
    foo66();    // 怎么在这里停止线程呢
    ...
    foo98();
    foo99();
    foo100();;
}


怎么停止线程 因为实际情况嵌套在多个场景下,或者说有什么解决方式,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

万水千山粽是情ミ 2022-09-18 22:21:00

自己实现一个用于退出线程的异常类,foo66里面如果想退出线程,就直接抛出这个异常,然后在run里面抓异常return就可以。

public static class StopException extends RuntimeException {
    public StopException (){
        super();
    }

    public StopException (String message) {
        super(message);
    }

    public StopException (String message, Throwable cause) {
        super(message, cause);
    }
}

void thread_start(){

new Thread(){
    public void run(){
        try{
            callMethod1();
            callMethod2();
            callMethod3();
            callMethod4();
            callMethod5();
            callMethod6();
        }catch(StopException ex){
            return;
        }
    }
}.start();

}
void callMethod5(){

foo1();
foo2();
foo3();
foo4();
foo5();
...
foo66();    // 怎么在这里停止线程呢
throw new StopException();// 这里停止线程
...
foo98();
foo99();
foo100();;

}

笑饮青盏花 2022-09-18 22:21:00

一楼正解!!!

甜味拾荒者 2022-09-18 22:21:00
public class Test {
    public static void main(String[] args) throws InterruptedException {
        Test test = new Test();
        test.threadStart();
    }
    
    public void threadStart() {
        new Thread() {
            @Override
            public void run() {
                callMethod5();
                if (Thread.interrupted()) {
                    System.out.println("thread was interrupted.");
                    return;
                }
                callMethod6();
            }
        }.start();
    }

    public void callMethod6() {
        System.out.println(6);
    }

    public void callMethod5() {
        System.out.println(5.1);
        // 模拟中断条件,50% 几率
        if (Math.random() > 0.5) {
            Thread.currentThread().interrupt();
            return;
        }
        System.out.println(5.2);
    }
}

@殃殃

丶视觉 2022-09-18 22:21:00

问题本质是如何优雅的关闭掉一个线程:

  1. 通过在foo66()方法中设置volatile变量,同一时间只能有一个变量修改volatile变量,满足变量条件时,return掉。
  2. 用interrupt方式,响应中断,终止线程。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文