ScheduledExecutorService 定时任务,线程

java5 之后,并发线程部分增加了许多新的东西,新的启动、调度、管理线程的一大堆API,这时通过Executor来启动线程比Thread.start()更好,更容易控制线程的启动,销毁等,还可以使用线程池的功能。

一.创建任务

实际上就是实现Runnable接口,实现run方法。

二.执行任务

通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。

Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。

1、创建线程池(针对ScheduledExecutorService)

private static ScheduledExecutorService singleScheduler = Executors.newScheduledThreadPool(4);

2、添加任务到线程池中

当将一个任务添加到线程池中,线程池会为每个任务分配一个线程去跑任务。执行任务时间可以定时,可以临时。

(1)执行临时任务

ScheduledExecutorService 有两个比较好的方法执行临时任务 execute(),submit()

三个区别:

   a.参数不同

    execute() 只有一个方法,接收Runnable类,

    submit() 有三个重载方法,分别接收Runnable类,Callable类,和Runnable ,T(执行成功返回的值)

   b.返回值

    execute() 没有返回值,submit()有返回一个Future<> 执行后返回是否成功的标识。假如一个任务执行后,需要知道是否执行成功,如果失败,原因是什么。

   c.submit 方便异常处理

(2)执行定时任务 scheduleAtFixedRate,scheduleWithFixedDelay

a.scheduleAtFixedRate

具体参数说明

  public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay,long period,  TimeUnit unit);

  command 执行的线程;initialDelay 初始化延迟;period;两次开始执行最小时间间隔;unit 计时单位

b.scheduleWithFixedDelay

具体参数说明

  public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay,long delay,  TimeUnit unit);

  command 执行的线程;initialDelay 初始化延迟;delay;前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间);unit 计时单位

三、关闭对象

  shutdown();

四、示例

 1.简单的Runnable类

  excute()和submit()单个参数 的执行比较简单,不列。

  

package test;

public class ThreadDemo implements Runnable{

    public ThreadDemo(){

    }
    @Override
    public void run() {
        System.out.println("简单执行一下!");
    }
}

  2.临时任务的执行

  

package test;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;

public class TestThread {

    private static ScheduledExecutorService singleScheduler =  Executors.newScheduledThreadPool(4);

    public static void main(String[] args) {
        Future<String> f =singleScheduler.submit(new ThreadDemo(),"成功!");
        try {
            System.out.println(f.get());
        } catch (InterruptedException  e) {
            e.printStackTrace();
        }  catch (ExecutionException  e) {
            e.printStackTrace();
        }

    }
} 

返回结果

简单执行一下!
成功!

   3.定时任务的执行

scheduleWithFixedDelay与此方法区别只是参数有些差异。

package test;

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

public class TestThread {

    private static ScheduledExecutorService singleScheduler =  Executors.newScheduledThreadPool(4);

    public static void main(String[] args) {
        singleScheduler.scheduleAtFixedRate(new ThreadDemo(), 1, 1, TimeUnit.SECONDS);
    }
} 

  返回结果

  

简单执行一下!
简单执行一下!
简单执行一下!
简单执行一下!
简单执行一下!
时间: 2024-10-21 21:49:01

ScheduledExecutorService 定时任务,线程的相关文章

ScheduledThreadExecutor定时任务线程池

ScheduledThreadPoolExecutor 继承自ThreadPoolExecutor实现了ScheduledExecutorService接口.主要完成定时或者周期的执行线程任务. 代码如下: package com.itszt.test3; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurr

spring定时任务.线程池,自定义多线程配置

定时任务及多线程配置xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springfra

ScheduledExecutorService调度线程池运行几次后停止某一个线程

开发中偶尔会碰到一些轮询需求,比如我碰到的和银行对接,在做完某一个业务后银行没有同步给到结果,这时候就需要查询返回结果,我们的需求是5分钟一次,查询3次,3次过后如果没有结果则T+1等银行的文件,对于这种任务我们的要求是轮询不是很严格,所以我采取调度线程池方式,如果有查询任务,加入线程池,设置好执行次数及执行时间间隔,具体代码如下: 1 import org.junit.Test; 2 import org.slf4j.Logger; 3 import org.slf4j.LoggerFacto

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关

Java ScheduledExecutorService源码分析

Java 定时任务可以用Timer + TimerTask来做,或者使用ScheduledExecutorService,使用ScheduledExecutorService有两个好处: 1. 如果任务执行时间过长,TimerTask会出现延迟执行的情况.比如,第一任务在1000ms执行了4000ms,第二个任务定时在2000ms开始执行.这里由于第一个任务要执行4000,所以第二个任务实际在5000ms开始执行.这是由于Timer是单线程,且顺序执行提交的任务 2. 如果执行任务抛出异常,Ti

JAVA线程池应用的DEMO

在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了.在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不多说了. Java线程池说起来也简单,简单说下继承关系: ThreadPoolExecutor extends AbstractExecutorService implements ExecutorService extends Executor 还有一个支持延时执行线程和可以重复执行线程的实现类: Sc

Tomcat热部署,Web工程中线程没有终止

近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如下:org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.Il

SpringBoot 定时任务的使用

一点知识在JAVA开发领域,目前可以通过以下几种方式进行定时任务: Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务.ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类.其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响.Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用简单但功能强大.Qu

SpringBoot | :定时任务的使用

前言 上一章我们简单的讲解了关于异步请求相关知识点.这一章节,我们来讲讲开发过程也是经常会碰见的定时任务.比如每天定时清理无效数据.定时发送短信.定时发送邮件.支付系统中的定时对账等等,往往都会定义一些定时器,进行此业务的开发.所以,本章节介绍下在SpringBoot中定时任务如何使用及一点分布式定时服务的思考总结. 在JAVA开发领域,目前可以通过以下几种方式进行定时任务: Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任