java多线程开发ScheduledExecutorService简化方式

目录
  • 前言
  • 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简化的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java ScheduledExecutorService定时任务案例讲解

    一.ScheduledExecutorService 设计思想 ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. 需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务的状态. 1.线程任务 class MyScheduledExecutor implement

  • 基于ScheduledExecutorService的两种方法(详解)

    开发中,往往遇到另起线程执行其他代码的情况,用java定时任务接口ScheduledExecutorService来实现. ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. 注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态. 1.scheduleAtFix

  • ScheduledExecutorService任务定时代码示例

    本文主要分享了一则关于ScheduledExecutorService任务定时的实例代码,具体如下: 示例代码 package com.effective.common.concurrent.execute; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurre

  • Java 线程池ExecutorService详解及实例代码

    Java 线程池ExecutorService 1.线程池 1.1什么情况下使用线程池 单个任务处理的时间比较短. 将需处理的任务的数量大. 1.2使用线程池的好处 减少在创建和销毁线程上所花的时间以及系统资源的开销. 如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及"过度切换"; 2.ExecutorService和Executors 2.1简介 ExecutorService是一个接口,继承了Executor, public interface ExecutorS

  • Java ExecutorService四种线程池使用详解

    1.引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行.第三:提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控.但是要做到合理的利用线程池,必须对其原理了如指掌. 2.线程池使用 Executors提供的四种线程 1.newCachedThreadPool创建一个可缓存线程池

  • java多线程开发ScheduledExecutorService简化方式

    目录 前言 java多线程的应用场景 应用场景一: 应用场景二: ScheduledExecutorService方法简介 实例 实例结果 前言 java开发,多多少少会接触到多线程的应用开发场景,博主之前做多线程的时候就两种方式,一个是继承Thread一个是实现Runnable接口,不过用的多的还是实现Runnable接口,因为实现Runnable接口可以做多线程资源共享!而java.util.concurrent.ScheduledExecutorService接口将大大简化多线程应用的开发

  • Java多线程的常用创建方式总结

    Java现在有四种创建的方式:继承Threa类.实现Runnable接口.实现Callable接口.线程池 Thread.Runnable都在java.lang包下:Callable.线程池都在java.util.concurrent包下 1.继承Thread类,重写run方法 创建一个类继承Thread类,并重写run():因为run()是线程具体执行的方法 在测试类或者main()创建Thread对象,并调用start()启动线程 备注:start()是启动线程,run()是线程执行的业务方

  • Java多线程开发工具之CompletableFuture的应用详解

    做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁都爱不释手呢),好了我先简单举个列子,告诉你用它有多好.Single Dog拿一个Appointment来举个列子,如下: /** * 女神化完妆之后,还需要一小会选衣服,不过分吧. * 也就是说我们现在有2个异步任务,第一个是化妆,第二个是选衣服. * 选衣服要在化妆完成之后进行,这两个任务是串行

  • Java多线程实现四种方式原理详解

    1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果 后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放

  • java多线程开发之通过对战游戏学习CyclicBarrier

    CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续执行. 这篇文章将介绍CyclicBarrier这个同步工具类的以下几点 通过案例分析 两种不同构造函数测试 CyclicBarrier和CountDownLatch的区别 await方法及源码分析. 需求 继上一篇CountDo

  • java 多线程Thread与runnable的区别

    java 多线程Thread与runnable的区别 java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1,继承Thread类,重写父类run()方法 public class thread1 extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println("我是线程"+this.getId()); } } public static

  • java多线程之线程同步七种方式代码示例

    为何要使用同步?  java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),     将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,     从而保证了该变量的唯一性和准确性. 1.同步方法  即有synchronized关键字修饰的方法.     由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,     内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态.     代码

  • 详细解读JAVA多线程实现的三种方式

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法.start()方法是一个native方法,它将启动一个新线程,并执行run()方法.这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run(

  • Java多线程导致CPU占用100%解决及线程池正确关闭方式

    简介 情景:1000万表数据导入内存数据库,按分页大小10000查询,多线程,15条线程跑. 使用了ExecutorService executor = Executors.newFixedThreadPool(15) 本地跑了一段时间后,发现电脑CPU逐渐升高,最后CPU占用100%卡死,内存使用也高达80%. 排查问题 Debug 发现虽然创建了定长15的线程池,但是因为数据量大,在For中循环分页查询的List会持续加入LinkedBlockingQueue() 队列中每一个等待的任务,又

  • 一篇文中细看Java多线程的创建方式

    前言 Java现在有四种创建的方式:继承Threa类.实现Runnable接口.实现Callable接口.线程池 Thread.Runnable都在java.lang包下:Callable.线程池都在java.util.concurrent包下 1.继承Thread类,重写run方法 创建一个类继承Thread类,并重写run():因为run()是线程具体执行的方法. 在测试类或者main()创建Thread对象,并调用start()启动线程 备注:start()是启动线程,run()是线程执行

随机推荐