java多线程开发ScheduledExecutorService简化方式

 更新时间:2022年03月08日 09:22:19   作者:kl  
这篇文章主要为大家介绍了java多线程开发ScheduledExecutorService的简化方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

前言

java开发,多多少少会接触到多线程的应用开发场景,博主之前做多线程的时候就两种方式,一个是继承Thread一个是实现Runnable接口,不过用的多的还是实现Runnable接口,因为实现Runnable接口可以做多线程资源共享!而java.util.concurrent.ScheduledExecutorService接口将大大简化多线程应用的开发!也能轻松解决任务定时执行的问题!

java多线程的应用场景

应用场景一:

做过微信开发的都知道,微信的token是有失效时间的,而且每天获取token都是有限制的,不能每次需要的时候取一次,只能快过期的时候重新去取,这个时候我们就可以给取token的这个操作单独开个线程,每次取完后线程休眠一段继续去取,这样就保证了token永远都是有效的 !    

应用场景二:

同样是微信开发中的问题,微信服务器连我们服务器的时候,必须五秒内响应结果,不然微信就直接提示用户,该服务不可用了。而我们不可能所有的业务都能做到五秒内完成并响应微信服务器。比如从微信服务器上下载用户提交的文件保存到我们自己的文件服务器上,(微信服务器临时保存用户文件),文件的上传下载都是比较耗时的操作,我们肯定不能等文件上传完了在响应微信,所有得单独开个线程还执行文件的下载上传操作 

ScheduledExecutorService方法简介

/**
     *指定delay时间后执行任务
     * @param command 执行的线程任务 Runnable不能返回执行结果
     * @param delay 指定某个时间后执行
     * @param unit 指定时间单位
     * @return
     */
    public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) {
        return null;
    }
    /**
     *指定delay时间后执行任务
     * @param callable 执行的线程任务 Callable返回执行结果
     * @param delay 指定某个时间后执行
     * @param unit 指定时间单位
     * @param
     * @return
     */
    publicScheduledFutureschedule(Callablecallable, long delay, TimeUnit unit) {
        return null;
    }
    /**
     *等待initiaDelay时间后,每个period时间执行一次
     * @param command
     * @param initialDelay
     * @param period
     * @param unit
     * @return
     */
    public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
        return null;
    }
    //scheduleWithFixedDelay和scheduleAtFixedRate差不多
    public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
        return null;
    }

实例

/**
 * @author kl by 2016/5/14
 * @boke www.kailing.pub
 */
public class Test  {
    public static int count=0;
    public static void main(String[] args) {
        //初始化两个线城池大小的任务调度服务
        ScheduledExecutorService executorService= Executors.newScheduledThreadPool(2);
        //任务一:0秒后开始执行,之后每秒执行一次
        final ScheduledFuture test1= executorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("任务一执行第"+(count++)+"次   "+Thread.currentThread());
            }
        },0, 1,TimeUnit.SECONDS);

        //任务二:6秒后开始执行,并返回执行结果
       final   ScheduledFuture test2 = executorService.schedule(new Callable() {
            public Object call()  {
                System.out.println("任务二执行,传递执行结果给任务三  "+Thread.currentThread());
                return "任务二已执行完,请知晓!";
            }
        },6,TimeUnit.SECONDS);

        //任务三:8秒后执行,打印任务二的结果,终止任务一
        executorService.schedule(new Runnable() {
            public void run() {
                try {
                    System.out.println(test2.get());
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("任务三执行,任务一终止  "+Thread.currentThread());
               test1.cancel(true);
            }
        },8,TimeUnit.SECONDS);

        System.out.println("我是最先执行的吗?不一定,虽然我是主线程  "+Thread.currentThread());
    }
}

ps:因为任务三种涉及了任务二的执行结果,所以即使任务三的执行时间设置在任务二的执行前面,任务三也要等到任务二执行完后才能执行 ,这个可以修改执行时间自己测试测试,体会体会

实例结果

以上就是java多线程开发ScheduledExecutorService简化方式的详细内容,更多关于java多线程开发ScheduledExecutorService简化的资料请关注脚本之家其它相关文章!

相关文章

  • Spring MVC中自定义拦截器的实例讲解

    Spring MVC中自定义拦截器的实例讲解

    下面小编就为大家带来一篇Spring MVC中自定义拦截器的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java Stream比较两个List的差异并取出不同的对象四种方法

    Java Stream比较两个List的差异并取出不同的对象四种方法

    今天开发一个需求时要对A和B两个List集合遍历,并比较出集合A有,而集合B没有的值,下面这篇文章主要给大家介绍了关于Java Stream比较两个List的差异并取出不同对象的四种方法,需要的朋友可以参考下
    2024-01-01
  • 23种设计模式(4) java生成器模式

    23种设计模式(4) java生成器模式

    这篇文章主要为大家详细介绍了23种设计模式之java生成器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Mybatis常用注解中的SQL注入实例详解

    Mybatis常用注解中的SQL注入实例详解

    MyBatis是一款优秀的持久层框架,它支持定制化 SQL(灵活)、存储过程(PLSQL模块化的组件,数据库的一部分)以及高级映射(表映射为Bean也可以将Bean映射为表),下面这篇文章主要给大家介绍了关于Mybatis常用注解中的SQL注入的相关资料,需要的朋友可以参考下
    2022-02-02
  • Java实现按行读取大文件

    Java实现按行读取大文件

    这篇文章主要介绍了Java实现按行读取大文件的方法的小结,非常的简单实用,有需要的小伙伴尅参考下。
    2015-05-05
  • SpringBoot缓存预热实战

    SpringBoot缓存预热实战

    缓存预热是一种常见的优化策略,旨在提高系统的响应速度和性能,本文主要介绍了SpringBoot缓存预热实战指南,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • SpringBoot通过ThreadLocal实现登录拦截详解流程

    SpringBoot通过ThreadLocal实现登录拦截详解流程

    这篇文章主要介绍了SpringBoot(HandlerInterceptor)+ThreadLocal实现登录拦截,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Android token过期刷新处理的方法示例

    Android token过期刷新处理的方法示例

    这篇文章主要介绍了Android token过期刷新处理的方法示例,本文详细的介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Spring question问题小结

    Spring question问题小结

    在AppConfig配置类中,通过@Bean注解创建了Service和Controller的实例,Spring会自动将这些实例纳入容器的管理,并处理它们之间的依赖关系,本文给大家介绍Spring question问题小结,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Java实现的微信公众号获取微信用户信息示例

    Java实现的微信公众号获取微信用户信息示例

    这篇文章主要介绍了Java实现的微信公众号获取微信用户信息,结合实例形式分析了Java微信公众号获取微信用户信息相关原理、步骤与操作注意事项,需要的朋友可以参考下
    2019-10-10

最新评论