如何从内部阻止线程?

piok6c0g  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(290)

这个问题在这里已经有答案了

更好的方法来通知其他线程停止(5个答案)
如何正确停止java中的线程(9个答案)
15天前关门了。
考虑以下代码:-

class A {
    Thread t = new Thread() {
        @Override
        public void run() {
            super.run();

            // Tons of statements.... (Set 1)

            if(/* We don't meet certain requirements for continuing */) {

                // Exit and stop the thread and do not execute any following statements after the if block

            }

            // Tons of statements.... (Set 2)
        }
    };

    public void run() {
        t.start();
    }
}

class B {
    public static void main(String[] args) {
        A obj = new A();
        obj.run();
    }
}

我们从 main b类。
说吧 main 在b班完成所有的指令 Thread t 仍在执行集合1中的语句。
现在,只有两种方法 t 停止。要么它到达语句集2的末尾(这将导致线程消亡),要么 if 阻止 Thread t .
我想知道如何实现这样一个if块?
如果我只是写 join() ,然后 Thread t 似乎没有执行furthur命令,但它仍然活着,并没有消失(我从我的实验中观察到)。
以及 stop() 折旧。那么,什么是正确的方式来实施必要的政策呢 if 阻止。如果在continuti之前某些条件不满足,那么代码应该在不执行任何进一步指令(在if块下面)的情况下结束tread,然后线程立即死亡。
现在,一个简单而合适的解决方案就是把所有set2指令放进去 else 阻止,
但我想知道有没有其他合适的方法。
我正在制作一个基于文本的游戏,我创建了多个 Class A . 对于每一个示例,我必须在多个地方进行这样的检查。
把所有的代码放进去 else 块将使代码过于嵌套。压痕看起来很糟糕,感觉这不是正确的方法。
它也会帮助我更好地理解线程。开始线程很容易,但停止线程总是对我的大脑造成沉重的损失。

hrysbysz

hrysbysz1#

线程在其 run 方法完成。这个 return 语句终止方法。自方法 run 不返回值,只需写入 returnif 块将终止方法,然后终止线程。

if(/* We don't meet certain requirements for continuing */) {
    return;
}
h79rfbju

h79rfbju2#

阿布拉的回答是正确的。让我补充一下关于避免 Thread .
自Java5以来,我们通常不再处理 Thread 直接上课。而是使用executor服务。通过a Runnable 或者 Callable 您要执行的任务是谁的代码。
在您的主要方法中:

ExecutorService executorService = Executors. … ;

Runnable runnable = () -> {
     // Tons of statements … 
    if( whatever ) 
    {
        return ;  // Method ends. So then thread ends or is returned to thread pool managed by the executor service.
    }
    // …
    // Method ends. So then thread ends or is returned to thread pool managed by the executor service.
};

executorService.submit( runnable ) ; 
… 
executorService.shutdown() ;

将来,当织布机计划到来时, ExecutorServiceAutoCloseable . 所以我们可以在executor服务中使用try-with-resources语法。以及 try 语句将被阻止,直到所有提交的任务都完成(完成或中断)。此时executor服务将自动关闭。

相关问题