在某些情况发生后停止线程 ScheduledThreadPoolExecutor

Posted

技术标签:

【中文标题】在某些情况发生后停止线程 ScheduledThreadPoolExecutor【英文标题】:Stop a thread ScheduledThreadPoolExecutor after some condition occure 【发布时间】:2020-05-05 17:21:29 【问题描述】:

我想要一些线程池,它每隔固定的时间运行一些任务(这个线程池一直在获取任务)。每个任务调用一些 API 来获取一些值,该值可以为 null。只有当返回值为空时,我才希望任务再次运行(在固定时间之后)。否则,我不希望此任务再次运行。有没有办法做到这一点? 我唯一想到的是使用 ScheduledThreadPoolExecutor 并从内部杀死特定线程,但我没有找到这样做的方法,我不确定这是一个好习惯。

谢谢!

【问题讨论】:

【参考方案1】:

您可以按一项安排任务,并在安排下一个任务之前检查您的状况:

public class Solver 

    final long delay = 500L;

    String getSomeValue() 
        if (Math.random() < 0.8) return "not-null";
        return null;
    

    void init() 
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(8);
        Runnable runnable = new Runnable() 
            @Override
            public void run() 
                long time = System.currentTimeMillis();
                String value = getSomeValue();
                System.out.println("" + value + " " + System.currentTimeMillis());
                if (value == null) 
                    executor.schedule(this, delay - (System.currentTimeMillis() - time), TimeUnit.MILLISECONDS);
                
            
        ;
        executor.schedule(runnable, delay, TimeUnit.MILLISECONDS);
    

    public static void main(String[] args) 
        new Solver().init();
    


【讨论】:

非常感谢!这似乎是我想要的。如果我错了,请纠正我,应该是'if(value == null)'对吗?另外,能否请您解释一下这一行 - 'executor.schedule(this, delay - (System.currentTimeMillis() - time), TimeUnit.MILLISECONDS);'?再次感谢! 是的,应该是value==null。即使getSomeValue 运行缓慢,我们也使用delay - (System.currentTimeMillis() - time) 来保持固定延迟。如果我们只是使用delay,那么如果getSomeValue运行,例如25ms,那么它将在delay + 25 ms 中调用一次,而不是在delay ms 中调用一次。

以上是关于在某些情况发生后停止线程 ScheduledThreadPoolExecutor的主要内容,如果未能解决你的问题,请参考以下文章

如何停止一个正在运行的线程?

如何停止一个正在运行的线程?

是否可以在不停止被跟踪者的情况下读取线程的指令指针?

使用某些 UI 元素后模拟停止

JMeter压测时如何在达到给定错误数量后停止测试

Android信号量停止线程