如何按条件移除scheduledexecutorservice线程池中的任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何按条件移除scheduledexecutorservice线程池中的任务相关的知识,希望对你有一定的参考价值。

java中的定时器功能

在jdk1.5之前,大家都用传统的定时器Timer来实现该功能
如,我们需要定制一个特殊方法,在程序首次载入时就执行,以后每隔一定的时间去执行那个方法
传统的做法如下;

[html] view plain copy
/**
* 定时器的测试(传统方式)
*/
public static void testTimer()

Timer timer = new Timer();
TimerTask task = new TimerTask()

@Override
public void run()
System.out.println("Timer:测试开始!");

;
//第一个参数是要执行的任务
//第二个是程序启动后要延迟多长后执行,单位毫秒
//第三个参数是,第一次执行后,以后每隔多长时间后在行
timer.schedule(task, 5000, 3000);


jdk1.5出来后,我们就可以改变这种做法,换种方式
如代码:

[html] view plain copy
/**
* 定时器的测试(ScheduledExecutorService)
*/
public static void testExcuters()
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);

service.scheduleAtFixedRate(new Runnable()

@Override
public void run()
System.out.println("ScheduledExecutorService:测试开始");


, 5, 3,TimeUnit.SECONDS);
参考技术A public class ConditionCancelScheduler 
    private static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public static void main(String[] args) throws Exception 
        final String jobID = "my_job_1";
        final AtomicInteger count = new AtomicInteger(0);
        final Map<String, Future> futures = new HashMap<>();

        final CountDownLatch countDownLatch = new CountDownLatch(1);
        Future future = scheduler.scheduleWithFixedDelay(new Runnable() 
            @Override
            public void run() 
                System.out.println(count.getAndIncrement());

                if (count.get() > 10) 
                    Future future = futures.get(jobID);
                    if (future != null) future.cancel(true);
                    countDownLatch.countDown();
                
            
        , 0, 1, TimeUnit.SECONDS);

        futures.put(jobID, future);
        countDownLatch.await();

        scheduler.shutdown();
    

拿去调试一下

如何按条件中断 Spring Security Provider 链?

【中文标题】如何按条件中断 Spring Security Provider 链?【英文标题】:How to interrupt spring security provider chain by condition? 【发布时间】:2016-07-09 13:47:29 【问题描述】:

我有以下 sring 安全配置:

<security:authentication-manager>
    <security:authentication-provider ref="provider1"/>
    <security:authentication-provider ref="provider2"/>
    <security:authentication-provider ref="provider3"/>
    <security:authentication-provider ref="provider4"/>
    <security:authentication-provider ref="provider5"/>
    <security:authentication-provider ref="provider6"/>
</security:authentication-manager>

如果现在晚于 21-00,我需要始终返回 auth fail。

我不想为每个提供者添加相同的代码。

有更好的方法吗?

【问题讨论】:

你可以投掷和AccountStatusException。 ***.com/questions/9303502/… @Evgeni 是正确的。但我不明白为什么这对 BadCredentialsException 不起作用 @Evgeni 我在文档中没有看到关于它的提及 我不知道。我刚刚找到了答案... @Evgeni 还是谢谢 【参考方案1】:

这是自定义安全 Web 表达式的典型示例。它用于拦截 url 模式而不是身份验证提供程序

有关详细信息,请查看此answer,其中包含有关实现自定义表达式的更多详细信息

【讨论】:

这些提供程序是很多年前写的,我没有理清它们是如何工作的。我只需要添加额外的约束 这样我的想法就更好了,因为你不需要接触提供者,你只需要添加安全表达式。 请描述这个解决方案。我已经阅读了您的主题,但我仍然不明白。 我应该添加哪些类?

以上是关于如何按条件移除scheduledexecutorservice线程池中的任务的主要内容,如果未能解决你的问题,请参考以下文章

WPF:如何以编程方式从 TextBox 中移除焦点

关于viewport引起的微信二维码识别区域偏移的问题讨论与解决

MSI InstallFinalize ARP 移除条件

Java8 List集合移除满足条件的元素

R语言dplyr包移除dataframe数据行实战(Remove Rows):按照条件移除数据行按照索引移除数据行删除包含NA值的所有数据行删除具体列包含NA值的数据行

c#winform中,DataGridView的选择列(DataGridViewCheckBoxColumn)中,如何实现条件选中?