如何按条件移除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线程池中的任务的主要内容,如果未能解决你的问题,请参考以下文章
关于viewport引起的微信二维码识别区域偏移的问题讨论与解决
R语言dplyr包移除dataframe数据行实战(Remove Rows):按照条件移除数据行按照索引移除数据行删除包含NA值的所有数据行删除具体列包含NA值的数据行
c#winform中,DataGridView的选择列(DataGridViewCheckBoxColumn)中,如何实现条件选中?