广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 如何实现时间控制
  • 593
分享到

Java 如何实现时间控制

2024-04-02 19:04:59 593人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、间控制的几种方案1.1 从线程方面解决1.2使用Timer1.3Redis延时二、redis2.1Maven中引入redis2.2 在SpringBoot中配置redis2.

前言:

需求是这样的,在与第三方对接过程中,对方提供了token进行时效性验证,过一段时间token就会失效.后台有定时任务在获取,但是偶尔会出现token失效,这是因为在获取的时候,定时任务正在跑,可能正在获取最新的token中,这个时候如何过一段时间(比如800毫秒之后)再请求呢?小王仰望天空45度,思考起来了。。。

一、间控制的几种方案

1.1 从线程方面解决

最简单粗暴的一种实现方案:Thread.sleep(800) ,但是很快就被小王给pass掉了。为什么呢?虽然这种方式可以,但是存在一个隐患,如果在多线程环境下,线程很容易被interrupt,这样代码就会抛出异常,这样线程就会挂起,导致整个线程异常结束。实在是不够优雅,违背了我们设计的初衷。

1.2使用Timer

查阅了jdk,我发现有个实现定时的类,使用它是可以的,在jdk中提供了定时器类,这个类的主要作用就是控制一定的时间来简单的定时执行某个任务。有点简单的elasticJob的设计味道。接下来看一下,用timmer如何实现延时。。有点惊喜,我们来写一个最简单的例子来看一下如何实现定时任务:


public class TimmerTest {
   
    public void test() {
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 800);
    }

    public class MyTask extends TimerTask {

        
        @Override
        public void run() {
            System.out.println("输出");
        }
    }
}

这是一个很简单的定时器实现,可以看出它只需要将方法对应的类继承自MyTask就可以实现定时执行,这种方法是可以实现延时的效果,但是它有一个致命的缺点:对代码的侵入性太大,为了实现定时我们不得已将对应的方法封装成一个类,然后放在定时器里执行。这样的、是可以的,但未免也有点太得不偿失了。为此我要更改整个类的结构,对于修改一个东西,我们要尽量按照最简单的方式最好的效果来实现,所以这种方案也应该pass掉。

1.3redis延时

在redis中存在一个命令:EXPIRE,这个命令可以设置键存活的时间。一旦超过指定的时间,redis就会将键对应的值给删除掉,因此可以利用这一特性,我们来曲线实现延时功能。

通过EXPIRE命令可以设置键的过期时间,一旦超过预设的时间,值就会变成(nil)。利用这一点,加入一些业务参数,我们就可以有效的实现延时的目的。通过redis的过期时间使用redis的好处有以下几点:

  • 1:对代码的侵入性低,不用额外起另外的线程来执行。只需要加入一个方法就可以对单流程的时间控制
  • 2:实现方便灵活,通过key设值可以加入一些唯一性的id来表示业务含义,从而保证业务的稳健实现
  • 3:简单,真正的代码实现起来只有很少,下面会给出代码示范。

二、redis

2.1maven中引入redis

引入spring-boot-starter-data-redis,这是springboot专门针对redis出的整合依赖库,整合度要比jedis、和redssion都要好,所以推荐这个依赖库:


<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
      <exclusions>
        <exclusion>
          <groupId>io.lettuce</groupId>
          <artifactId>lettuce-core</artifactId>
        </exclusion>
      </exclusions>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>

2.2 在springboot中配置redis


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JSONRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    
    @Bean
    public RedisTemplate redisTemplateInit() {
        //设置序列化Key的实例化对象
        redisTemplate.seTKEySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2jsonRedisSerializer());
        return redisTemplate;
    }

}

2.3redisTemplate模板工具类


@Component
public class RedisManager {

    private static final Logger LOGGER = LoggerFactory.getLogger(RedisManager.class);

    @Autowired
    private RedisTemplate redisTemplate;

    
    @SuppressWarnings("unchecked")
    public <T> ValueOperations<String, T> setObject(final String key, final T value) {
        final ValueOperations<String, T> operation = redisTemplate.opsForValue();
        operation.set(key, value);
        return operation;
    }

    
    @SuppressWarnings("unchecked")
    public <T> ValueOperations<String, T> setObject(final String key, final T value, final long time) {
        final ValueOperations<String, T> operation = redisTemplate.opsForValue();
        operation.set(key, value, time, TimeUnit.SECONDS);
        return operation;
    }


    
    @SuppressWarnings("unchecked")
    public <T> ValueOperations<String, T> setObjectFORMillSeconds(final String key, final T value, final long time) {
        final ValueOperations<String, T> operation = redisTemplate.opsForValue();
        operation.set(key, value, time, TimeUnit.MILLISECONDS);
        return operation;
    }

    
    @SuppressWarnings("unchecked")
    public Object getObject(final String key) {
        final ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
        if (valueOperations == null || !redisTemplate.hasKey(key)) {
            return null;
        }
        final Object object = valueOperations.get(key);
        return object;
    }

    
    @SuppressWarnings("unchecked")
    public String getString(final String key) {
        String value = "";
        final ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
        if (valueOperations != null && redisTemplate.hasKey(key)) {
            final Object object = valueOperations.get(key);
            if (null != object) {
                LOGGER.info("--getString--object not empty");
                value = object.toString();
            } else {
                LOGGER.info("--getString--object empty");
            }
        }
        return value;
    }

2.4在redis中实现时间控制

2.4.1无限循环比较值

在流程中停留一段时间,通过无限循环来不断的从redis取数值,一旦取到的值为null(redis的键值为null)就退出,这样的写法有点类似于以前CAS的些许味道,通过无限循环比较值。


import com.youjia.orders.redis.RedisManager;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Objects;



public class RedisTest extends OrderProviderApplicationTests {

    @Autowired
    private RedisManager redisManager;

    @Test
    public void test() {
        controlTime("10000001", 10L);
    }

    public void controlTime(String requestId, Long timeOut) {

        if (Objects.isNull(requestId) || Objects.isNull(timeOut)) {
            return;
        }
        //something code
        final String value = "value";
        redisManager.setObject(requestId, value, timeOut);
        final long startTime = System.currentTimeMillis();
        System.out.println("开始控制时间");
        //start
        for (; ; ) {
            if (Objects.isNull(redisManager.getObject(requestId))) {
                break;
            }
        }
        final long endTime = System.currentTimeMillis();

        final long useTime = endTime - startTime;

        System.out.println("一共耗费时间:" + useTime);
    }
}

outPut:

开始控制时间
一共耗费时间:10042

三、总结

本篇博文讲述了在平时工作中,我们可能会遇到的一些关于时间控制的问题,在这个问题上我又进行了进一步的探讨,如何实现优雅的解决问题?我们解决问题不仅仅是要把这个问题解决了,而是要考虑如何更好更秒的解决,这就要善于利用一些中间件或者工具类提供的功能特性,善于发现、及时变通,把这种特性利用到我们的代码中,会对我们的开发起到推波助澜、如虎添翼的作用!

到此这篇关于Java 如何实现时间控制的文章就介绍到这了,更多相关Java 实现时间控制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 如何实现时间控制

本文链接: https://www.lsjlt.com/news/154420.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 如何实现时间控制
    目录一、间控制的几种方案1.1 从线程方面解决1.2使用Timer1.3redis延时二、redis2.1maven中引入redis2.2 在springboot中配置redis2....
    99+
    2022-11-12
  • 如何使用JS时间控制实现动态效果
    这篇文章主要介绍了如何使用JS时间控制实现动态效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:<script> &n...
    99+
    2022-10-19
  • 如何实现Go超时控制
    这篇文章主要介绍如何实现Go超时控制,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!为什么需要超时控制?请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义过长时间的服务端处理会占用过多...
    99+
    2023-06-14
  • ahooks控制时机的hook如何实现
    本篇内容主要讲解“ahooks控制时机的hook如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ahooks控制时机的hook如何实现”吧!Function Component VS Cl...
    99+
    2023-07-02
  • Java实现控制台输出两点间距离
    计算两点之间的距离然后在控制台输出,这个题目还是挺简单的。下面我们来看看具体代码。package com.swift;import java.util.Scanner;public class PToP { public static v...
    99+
    2023-05-31
    java 控制台 ava
  • java怎么实现时间时钟
    Java中可以使用`java.util.Date`类和`java.text.SimpleDateFormat`类来实现时间时钟。首先...
    99+
    2023-08-29
    java
  • Java中实现时间与时间戳的转换
    public static void main(String[] args) { // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ...
    99+
    2023-09-30
    java python 开发语言
  • 一文搞懂如何实现Go 超时控制
    为什么需要超时控制? 请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义 过长时间的服务端处理会占用过多资源,导致并发能力下降,甚至...
    99+
    2022-06-07
    GO
  • java中DateUtils时间工具类如何实现
    这篇文章将为大家详细讲解有关java中DateUtils时间工具类如何实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下package com.example.administrat...
    99+
    2023-05-30
    java dateutils
  • 利用Java如何实现获取UTC时间
    本篇文章为大家展示了利用Java如何实现获取UTC时间,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。本文实例讲述了Java获取UTC时间的方法。分享给大家供大家参考,具体如下:取得本地时间:java...
    99+
    2023-05-31
    java utc时间 ava
  • Java的API时间格式化如何实现
    这篇文章主要讲解了“Java的API时间格式化如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的API时间格式化如何实现”吧!新API的时间格式化新的时间API的时间格式化由j...
    99+
    2023-07-06
  • Java如何实现获取wav时间长度
    这篇文章主要为大家展示了“Java如何实现获取wav时间长度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何实现获取wav时间长度”这篇文章吧。Maven依赖<dependenc...
    99+
    2023-06-25
  • 怎么实现Go超时控制
    这篇文章给大家分享的是有关怎么实现Go超时控制的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么需要超时控制?请求时间过长,用户侧可能已经离开本页面了,服务端还在消耗资源处理,得到的结果没有意义过长时间的服务端...
    99+
    2023-06-14
  • PHP如何实现时间戳仅取时间
    这篇文章主要介绍“PHP如何实现时间戳仅取时间”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP如何实现时间戳仅取时间”文章能帮助大家解决问题。在 PHP 中,我们可以使用date函数来格式化时间...
    99+
    2023-07-05
  • android自定义控件如何实现简易时间轴
    这篇“android自定义控件如何实现简易时间轴”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“android自定义控件如何实现简易时间轴”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过...
    99+
    2023-06-28
  • java控制台如何实现聊天程序
    本篇内容主要讲解“java控制台如何实现聊天程序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java控制台如何实现聊天程序”吧!本文实例为大家分享了java控制台实现聊天程序的具体代码,供大家...
    99+
    2023-06-20
  • Android自定义控件实现时间轴
    本文实例为大家分享了Android自定义控件实现时间轴的具体代码,供大家参考,具体内容如下 由于项目中有需求,就简单的封装一个,先记录一下,有时间上传到github。 1、先增加自定...
    99+
    2022-11-12
  • angular中如何实现控制器之间传递参数
    这篇文章将为大家详细讲解有关angular中如何实现控制器之间传递参数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在angular中,每个controller(控制器)...
    99+
    2022-10-19
  • Go 协程超时控制的实现
    目录Go 协程超时控制Select 超时控制 go timer 计时器 go context Go 协程超时控制 Select 阻塞方式 Context 方式 先...
    99+
    2022-11-12
  • 如何利用Git的版本控制功能,实现Java项目的实时加载?
    Git是目前最流行的版本控制工具之一,它被广泛应用于开发团队中,以管理和跟踪代码的版本。除此之外,Git还可以帮助开发人员实现Java项目的实时加载。本文将介绍如何利用Git的版本控制功能,实现Java项目的实时加载。 一、Git的版本控制...
    99+
    2023-09-21
    git 实时 load
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作