03_java内置线程池(ScheduledExecutorService)

1,ScheduledExecutorServic介绍

ScheduledExecutorService是ExecutorService的子接口,具备了延迟运行或定期执行任务的能力,

2,常用获取方式如下

  • static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
    创建一个可重用固定线程数的线程池且允许延迟运行或定期执行任务;
  • static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
    创建一个可重用固定线程数的线程池且线程池中的所有线程都使用ThreadFactory来创建,且允许延迟运行或定期执行任务;
  • static ScheduledExecutorService newSingleThreadScheduledExecutor()
    创建一个单线程执行程序,它允许在给定延迟后运行命令或者定期地执行。
  • static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)
    创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

3,常用方法如下

  • ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit)
    延迟时间单位是unit,数量是delay的时间后执行callable。
  • ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
    延迟时间单位是unit,数量是delay的时间后执行command。
  • ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
    延迟时间单位是unit,数量是initialDelay的时间后,每间隔period时间重复执行一次command。
  • ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
    创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。

4,延迟执行

4.1,newScheduledThreadPool(int corePoolSize)

延迟执行

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo01_NewScheduledThreadPool_Int {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(3);

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        es.schedule(new MyRunnable1(1),5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
        es.shutdown();
    }
}

@Slf4j
class MyRunnable1 implements Runnable{
    private int id;

    public MyRunnable1(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();
        log.info(name +"执行了任务,编号为:"+id);
    }
}

在这里插入图片描述
在这里插入图片描述

4.2,newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

参与线程的创建

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo02_NewScheduledThreadPool_Int_ThreadFactory {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(3, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r,"线程名称111");
            }
        });

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        es.schedule(new MyRunnable1(1),5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
        es.shutdown();
    }
}

@Slf4j
class MyRunnable2 implements Runnable{
    private int id;

    public MyRunnable2(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();
        log.info(name +"执行了任务,编号为:"+id);
    }
}


在这里插入图片描述

4.3,newSingleThreadScheduledExecutor()

只创建一个线程

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo03_NewSingleThreadScheduledExecutor {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newSingleThreadScheduledExecutor();

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        es.schedule(new MyRunnable1(1),5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
        es.shutdown();
    }
}

@Slf4j
class MyRunnable3 implements Runnable{
    private int id;

    public MyRunnable3(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();
        log.info(name +"执行了任务,编号为:"+id);
    }
}

在这里插入图片描述

4.4,newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo04_NewSingleThreadScheduledExecutor_ThreadFactory {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r,"线程名称222");
            }
        });

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        es.schedule(new MyRunnable1(1),5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
        es.shutdown();
    }
}

@Slf4j
class MyRunnable4 implements Runnable{
    private int id;

    public MyRunnable4(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();
        log.info(name +"执行了任务,编号为:"+id);
    }
}

在这里插入图片描述

5,重复执行

5.1 scheduleAtFixedRate

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

延迟时间单位是unit,数量是initialDelay的时间后,每间隔period时间重复执行一次command。

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo05_ScheduleAtFixedRate {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(1);

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        MyRunnable5 runnble = new MyRunnable5(1);
        /**
         * 参数数目
         *  1:运行任务
         *  2:初始等待时间
         *  3:间隔时间
         *  4:时间单位
         *
         *  运行1秒后每个5秒重复执行
         */
        es.scheduleAtFixedRate(runnble,1,5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
    }
}

@Slf4j
class MyRunnable5 implements Runnable{
    private int id;

    public MyRunnable5(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();

        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        log.info(name +"执行了任务,编号为:"+id);
    }
}


在这里插入图片描述

5.2 scheduleWithFixedDelay

scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。

package com.study.javaThreadPool.demo02_scheduledExecutorServic;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Demo06_ScheduleWithFixedDelay {
    public static void main(String[] args) {
        //1,获取一个延迟执行线程池任务的对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(1);

        //创建多个任务对象,提交任务,每个任务延迟5秒执行
        MyRunnable6 runnble = new MyRunnable6(1);
        /**
         * 参数数目
         *  1:运行任务
         *  2:初始等待时间
         *  3:间隔时间
         *  4:时间单位
         *
         *  运行1秒后每个5秒重复执行
         */
        es.scheduleWithFixedDelay(runnble,1,5, TimeUnit.SECONDS);
        log.info("ScheduledExecutorService执行结束");
    }
}

@Slf4j
class MyRunnable6 implements Runnable{
    private int id;

    public MyRunnable6(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        //获取线程的名称
        String name = Thread.currentThread().getName();
        log.info(name +"执行了任务,编号为:"+id);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ScheduledExecutorServiceJava中用来执行定时任务的线程池。它是Executor框架的一种实现,可以在指定的延迟之后或者按固定的时间间隔周期性地执行任务。 使用ScheduledExecutorService可以方便地创建一个线程池,其中的线程会自动调度执行任务,而不需要手动创建和管理线程。ScheduledExecutorService中的线程池可以根据需要动态地调整线程的数量,提供了更好的灵活性和效率。 使用ScheduledExecutorService来创建一个线程池可以通过Executors类的静态方法newScheduledThreadPool()来实现,例如: ```java ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); ``` 上述代码创建了一个包含5个线程的ScheduledExecutorService线程池。 然后,可以使用ScheduledExecutorServiceschedule()方法来安排任务的执行。schedule()方法有多个重载形式,其中最常用的形式接受一个Runnable对象和一个延迟时间作为参数,例如: ```java executor.schedule(new RunnableTask(), 5, TimeUnit.SECONDS); ``` 上述代码将会在5秒之后执行RunnableTask任务。 除了schedule()方法外,还有scheduleAtFixedRate()和scheduleWithFixedDelay()方法可以用来周期性地执行任务。scheduleAtFixedRate()方法可以在固定的时间间隔内周期性地执行任务,而scheduleWithFixedDelay()方法则是在任务执行完成后在固定的延迟时间后再次执行任务。 总结起来,ScheduledExecutorService线程池提供了一种方便的方式来执行定时任务,可以根据需要动态调整线程数量,更加灵活和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值