我已经实现了一个令牌系统,它可以分配固定数量的令牌.分配的每个令牌启动一个Timer,该Timer在几分钟后到期并清除该令牌槽以供重用.如果用户在计时器到期之前验证令牌,则应该取消计时器并使用另一个令牌有效期重置.我似乎无法从计时器线程外取消计时器,这是预期的行为.片段如下:

/**

* Fills one of the available slots with a new session key

* @param sessionKey

* @return true on slot fill success - false on fail

*/

public boolean fillSlot(String sessionKey)

{

if(count

{

//Add key to slot

slots.add(sessionKey);

//Up the key count

upCount();

//Set up expiry timer

Timer timer = new Timer();

timer.schedule(new ExpiringTokentask(timer,sessionKey), EXPIRY_TIME);

timers.put(sessionKey, timer);

return true;

}

return false;

}

/**

* Check if a given key is stored in the slots

* reset timer every time key is checked

* @param sessionKey

* @return true on key found false on not found

*/

public boolean checkSlot(String sessionKey)

{

//TODO: More efficient key search and storage for larger user sets

//TODO: Upgrade from memory array to h2 embedded DB

for(int i=0;i

{

if(sessionKey.equals(slots.get(i)))

{

//Reset timer

Timer timer = timers.get(sessionKey);

//Can't seem to do this

// timer.cancel();

timer.schedule(new ExpiringTokentask(timer,sessionKey), EXPIRY_TIME);

//Return token validation

return true;

}

}

return false;

}

private class ExpiringTokentask extends TimerTask

{

private Timer timer;

private String expireToken;

public ExpiringTokentask(Timer timer, String sessionKey)

{

this.timer = timer;

this.expireToken = sessionKey;

System.out.println(sessionKey);

}

public void run() {

System.out.format("Time's up!%n");

clearSlot(expireToken);

timer.cancel(); //Terminate the timer thread

}

}

解决方法:

如前所述,您可以取消提交给计时器的TimerTask而不是取消计时器,这样您就不需要更新更多的计时器.

你在做什么:

timer.cancel();

timer.schedule(...);

将抛出IllegalStateExceptions,因为您无法在已取消的计时器上安排新任务.

所以不要这样做:timer.cancel()

使您的映射成为从会话密钥到TimerTasks的映射,并取消TimerTask而不是Timer.这样您就不必新建新的计时器,并且在取消一个或多个任务后,计时器将按预期工作.您还可以使用一个计时器来处理多个会话.现在你正在制作一个Timer,因此每个会话一个线程.

另一方面,您不应该使用java.util.Timer.如果任何TimerTasks抛出异常会发生什么?你的计时器将被杀死,永远不会再次运行!如果你的一个TimerTasks很慢或无限期阻塞怎么办?该定时器上的任何其他TimerTasks将无法执行.请考虑使用ScheduledThreadPoolExecutor.我确信java.util.Timer将在下一个Java版本中弃用.

标签:java,timer

来源: https://codeday.me/bug/20190717/1485016.html

java怎么关掉定时器_java – 取消定时器相关推荐

  1. javascript定时器,取消定时器,及js定时器优化方法

    版权声明:转载请附链接,就这个要求. https://blog.csdn.net/johnstrive/article/details/42216005 通常用的方法: 启动定时器: window.s ...

  2. uni-app 中使用定时器和取消定时器

    uni-app 中使用定时器和清除定时器 uni-app 中我们应该如何使用定时器呢?在结束后我们该如何让清除定时器? 下面我们就来分享一下吧. 1. 定义一个timer data(){return{ ...

  3. java多线程机制计时器_java多线程定时器与单例模式

    定时器与单例模式 本次更新的主要内容是多线程中的定时器Timer和单例模式,本来打算分两次更新的,这次就在一起更新了.这次更新完之后,多线程的基础理论知识系列就完结了,后续会发布Mysql的内部技术分 ...

  4. android定时器取消,Android定时器崩溃取消

    我有一个定时器运行,然后熄灭,并做了一些事情,定时器启动罚款.Android定时器崩溃取消 然后我想要做的是点击一个按钮,然后创建一个电子邮件.除了在计时器运行时单击该按钮之外,一切正常,应用程序崩溃 ...

  5. java项目中多个定时器_在java项目中如何使用Timer定时器

    在java项目中如何使用Timer定时器 发布时间:2020-11-16 16:36:16 来源:亿速云 阅读:97 作者:Leah 在java项目中如何使用Timer定时器?很多新手对此不是很清楚, ...

  6. java定时器、Spring定时器和Quartz定时器

    当前java程序中能够实现定时的主要有三种方式,分别是:java定时器,spring定时器,quartz定时器. 下面依次讲讲他们的应用! java定时器的应用    其实java很早就有解决定时器任 ...

  7. TCP的定时器系列 — 保活定时器(有图有代码有真相!!!)

    转载 主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepa ...

  8. STM32F4 定时器TIM(1)定时器控制输出【使用库函数】

    高级时钟控制定时器TIM1&TIM8简介: STM32F4的高级控制定时器包含一个自动重装载计数器,计数器的输入是一个被预分频的系统时钟. 这个定时器有多种用途,包括车辆输入信号长度(输入捕获 ...

  9. STM32定时器学习---基本定时器

    STM32F1系列的产品,除了互联型产品外,工位8个定时器  TIM6.TIM7:基本定时器  TIM2/3/4/5:通用定时器  TIM1.TIM8:高级定时器 三种定时器的区别:  基本定时器:  ...

最新文章

  1. Java学习笔记07--日期操作类
  2. php.ini来配置session,php.ini 配置session自动开启
  3. 打造杰出软件开发团队的12条指导建议
  4. 启动hbase后hregionserver没有启动
  5. SAP Spartacus Set Active BaseSite action执行的时间点 - Route路由触发方式
  6. python mp4 切片_FFmpeg MP4视频切片成TS m3u8播放 好文收集
  7. 变频器按启动没反应_起重机软启动柜晶闸管损坏维修几大故障
  8. 为MongoDB定制Spring Social Connect框架
  9. 洛谷 P1272 重建道路
  10. 【POJ】2296 Map Labeler
  11. springboot缓存注解——@Cacheable和@CacheConfig
  12. 加密狗厂商及工作原理介绍
  13. hd620显卡驱动 linux,英特尔为Windows 10 推出新显卡驱动 26.20.100.7870
  14. 国外优秀的屏幕录象专家
  15. 午夜分享女人的绝对隐私
  16. android mjpg格式,Camera常用格式MJPEG和jpeg-turbo库
  17. 温度报警器c语言课程设计,综合电子设计课程设计实验报告-可调温度报警器.doc...
  18. mac(苹果)电脑有网,浏览器上不了网了,打开不了网页,但是微信、QQ正常使用,如何解决?
  19. 孩子小学总喜欢用计算机做数学,数学到底该怎样学?真实用!
  20. 折腾了好久 ORA-00904: : 无效的标识符

热门文章

  1. 牛客竞赛-NC13230
  2. MPI 归约操作简介
  3. xutils断点续传_xUtils3的简单介绍
  4. 论文阅读:RoadMap: A Light-Weight Semantic Map for Visual Localizationtowards Autonomous Driving轻量语义自动驾驶
  5. Android中apk加固完善篇之内存加载dex方案实现原理(不落地方式加载)
  6. 【机器学习】 逻辑回归原理及代码
  7. 一些MIPS指令的解释
  8. 医疗机器人软件中的机器人机器人编程技术:机器人技术的创新应用
  9. .NETCore MVC上传图片
  10. c语言eof的头文件,vc eof函数是在哪个头文件里面