iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中定时任务的实现方式有哪些
  • 755
分享到

Java中定时任务的实现方式有哪些

2023-06-25 12:06:48 755人浏览 泡泡鱼
摘要

本篇内容主要讲解“Java中定时任务的实现方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中定时任务的实现方式有哪些”吧!1、线程等待实现先从最原始最简单的方式来讲解。可以先创建

本篇内容主要讲解“Java中定时任务的实现方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中定时任务的实现方式有哪些”吧!

1、线程等待实现

先从最原始最简单的方式来讲解。可以先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。

public class Task {    public static void main(String[] args) {        // run in a second        final long timeInterval = 1000;        Runnable runnable = new Runnable() {            @Override            public void run() {                while (true) {                    System.out.println("Hello !!");                    try {                        Thread.sleep(timeInterval);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        };        Thread thread = new Thread(runnable);        thread.start();    }}

这种方式简单直接,但是能够实现的功能有限,而且需要自己来实现。

2、jdk自带Timer实现

目前来看,JDK自带的Timer api算是最古老的定时任务实现方式了。Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以安排任务“执行一次”或者定期“执行多次”。

在实际的开发当中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。

2.1 核心方法

imer类的核心方法如下:

// 在指定延迟时间后执行指定的任务schedule(TimerTask task,long delay);// 在指定时间执行指定的任务。(只执行一次)schedule(TimerTask task, Date time);// 延迟指定时间(delay)之后,开始以指定的间隔(period)重复执行指定的任务schedule(TimerTask task,long delay,long period);// 在指定的时间开始按照指定的间隔(period)重复执行指定的任务schedule(TimerTask task, Date firstTime , long period);// 在指定的时间开始进行重复的固定速率执行任务scheduleAtFixedRate(TimerTask task,Date firstTime,long period);// 在指定的延迟后开始进行重复的固定速率执行任务scheduleAtFixedRate(TimerTask task,long delay,long period);// 终止此计时器,丢弃所有当前已安排的任务。cancal();// 从此计时器的任务队列中移除所有已取消的任务。purge();

2.2使用示例

下面用几个示例演示一下核心方法的使用。首先定义一个通用的TimerTask类,用于定义用执行的任务。

public class DoSomethingTimerTask extends TimerTask {    private String taskName;    public DoSomethingTimerTask(String taskName) {        this.taskName = taskName;    }    @Override    public void run() {        System.out.println(new Date() + " : 任务「" + taskName + "」被执行。");    }}
2.2.1指定延迟执行一次

 在指定延迟时间后执行一次,这类是比较常见的场景,

比如:当系统初始化某个组件之后,延迟几秒中,然后进行定时任务的执行。

public class DelayOneDemo {    public static void main(String[] args) {        Timer timer = new Timer();        timer.schedule(new DoSomethingTimerTask("DelayOneDemo"),1000L);    }}

执行上述代码,延迟一秒之后执行定时任务,并打印结果。其中第二个参数单位为毫秒。

2.2.2固定间隔执行

在指定的延迟时间开始执行定时任务,定时任务按照固定的间隔进行执行。比如:延迟2秒执行,固定执行间隔为1秒。

public class PeriodDemo {    public static void main(String[] args) {        Timer timer = new Timer();        timer.schedule(new DoSomethingTimerTask("PeriodDemo"),2000L,1000L);    }}

执行程序,会发现2秒之后开始每隔1秒执行一次。

2.2.3固定速率执行

在指定的延迟时间开始执行定时任务,定时任务按照固定的速率进行执行。

比如:延迟2秒执行,固定速率为1秒。

public class FixedRateDemo {    public static void main(String[] args) {        Timer timer = new Timer();        timer.scheduleAtFixedRate(new DoSomethingTimerTask("FixedRateDemo"),2000L,1000L);    }}

执行程序,会发现2秒之后开始每隔1秒执行一次。

此时,你是否疑惑schedulescheduleAtFixedRate效果一样,为什么提供两个方法,它们有什么区别?

2.3 schedule与scheduleAtFixedRate区别

在了解schedulescheduleAtFixedRate方法的区别之前,先看看它们的相同点:

  • 任务执行未超时,下次执行时间 = 上次执行开始时间 + period;

  • 任务执行超时,下次执行时间 = 上次执行结束时间;

在任务执行未超时时,它们都是上次执行时间加上间隔时间,来执行下一次任务。而执行超时时,都是立马执行。

它们的不同点在于侧重点不同,schedule方法侧重保持间隔时间的稳定,而scheduleAtFixedRate方法更加侧重于保持执行频率的稳定。

2.3.1schedule侧重保持间隔时间的稳定

schedule方法会因为前一个任务的延迟而导致其后面的定时任务延时。计算公式为scheduledExecutionTime(第n+1次) = realExecutionTime(第n次) + periodTime

也就是说如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task。

而接下来的第n+2次task的scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。这个方法更注重保持间隔时间的稳定。

2.3.2scheduleAtFixedRate保持执行频率的稳定

scheduleAtFixedRate在反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime +n*periodTime

如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task。

接下来的第n+2次的task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)*periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。

如果用一句话来描述任务执行超时之后schedule和scheduleAtFixedRate的区别就是:schedule的策略是错过了就错过了,后续按照新的节奏来走;scheduleAtFixedRate的策略是如果错过了,就努力追上原来的节奏(制定好的节奏)。

2.4 Timer的缺陷

Timer计时器可以定时(指定时间执行任务)、延迟(延迟5秒执行任务)、周期性地执行任务(每隔个1秒执行任务)。但是,Timer存在一些缺陷。首先Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。

其次Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,它会错误的认为整个Timer线程都会取消。同时,已经被安排单尚未执行的TimerTask也不会再执行了,新的任务也不能被调度。故如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。

3、JDK自带ScheduledExecutorService

ScheduledExecutorService是JAVA 1.5后新增的定时任务接口,它是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行。也就是说,任务是并发执行,互不影响。

需要注意:只有当执行调度任务时,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务的状态。

ScheduledExecutorService主要有以下4个方法:

ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);<V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnitunit);ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnitunit);

其中scheduleAtFixedRatescheduleWithFixedDelay在实现定时程序时比较方便,运用的也比较多。

ScheduledExecutorService中定义的这四个接口方法和Timer中对应的方法几乎一样,只不过Timerscheduled方法需要在外部传入一个TimerTask的抽象任务。 而ScheduledExecutorService封装的更加细致了,传RunnableCallable内部都会做一层封装,封装一个类似TimerTask的抽象任务类(ScheduledFutureTask)。然后传入线程池,启动线程去执行该任务。

3.1 scheduleAtFixedRate方法

scheduleAtFixedRate方法,按指定频率周期执行某个任务。定义及参数说明:

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

参数对应含义:command为被执行的线程;initialDelay为初始化后延时执行时间;period为两次开始执行最小间隔时间;unit为计时单位。

使用实例:

public class ScheduleAtFixedRateDemo implements Runnable{    public static void main(String[] args) {        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);        executor.scheduleAtFixedRate(                new ScheduleAtFixedRateDemo(),                0,                1000,                TimeUnit.MILLISECONDS);    }    @Override    public void run() {        System.out.println(new Date() + " : 任务「ScheduleAtFixedRateDemo」被执行。");        try {            Thread.sleep(2000L);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

上面是scheduleAtFixedRate方法的基本使用方式,但当执行程序时会发现它并不是间隔1秒执行的,而是间隔2秒执行。

这是因为,scheduleAtFixedRate是以period为间隔来执行任务的,如果任务执行时间小于period,则上次任务执行完成后会间隔period后再去执行下一次任务;但如果任务执行时间大于period,则上次任务执行完毕后会不间隔的立即开始下次任务。

3.2 scheduleWithFixedDelay方法

scheduleWithFixedDelay方法,按指定频率间隔执行某个任务。定义及参数说明:

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

参数对应含义:command为被执行的线程;initialDelay为初始化后延时执行时间;period为前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间);unit为计时单位。

使用实例:

public class ScheduleAtFixedRateDemo implements Runnable{    public static void main(String[] args) {        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);        executor.scheduleWithFixedDelay(                new ScheduleAtFixedRateDemo(),                0,                1000,                TimeUnit.MILLISECONDS);    }    @Override    public void run() {        System.out.println(new Date() + " : 任务「ScheduleAtFixedRateDemo」被执行。");        try {            Thread.sleep(2000L);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

上面是scheduleWithFixedDelay方法的基本使用方式,但当执行程序时会发现它并不是间隔1秒执行的,而是间隔3秒。

这是因为scheduleWithFixedDelay是不管任务执行多久,都会等上一次任务执行完毕后再延迟delay后去执行下次任务。

4、Quartz框架实现

除了JDK自带的API之外,我们还可以使用开源的框架来实现,比如Quartz

Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。

Quartz通常有三部分组成:调度器(Scheduler)、任务(JobDetail)、触发器(Trigger,包括SimpleTriggerCronTrigger)。下面以具体的实例进行说明。

4.1 Quartz集成

要使用Quartz,首先需要在项目的pom文件中引入相应的依赖:

<dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.3.2</version></dependency><dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz-jobs</artifactId>    <version>2.3.2</version></dependency>

定义执行任务的Job,这里要实现Quartz提供的Job接口:

public class PrintJob implements Job {    @Override    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        System.out.println(new Date() + " : 任务「PrintJob」被执行。");    }}

创建SchedulerTrigger,并执行定时任务:

public class MyScheduler {    public static void main(String[] args) throws SchedulerException {        // 1、创建调度器Scheduler        SchedulerFactory schedulerFactory = new StdSchedulerFactory();        Scheduler scheduler = schedulerFactory.getScheduler();        // 2、创建JobDetail实例,并与PrintJob类绑定(Job执行内容)        JobDetail jobDetail = JobBuilder.newJob(PrintJob.class)                .withIdentity("job", "group").build();        // 3、构建Trigger实例,每隔1s执行一次        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "triggerGroup")                .startNow()//立即生效                .withSchedule(SimpleScheduleBuilder.simpleSchedule()                        .withIntervalInSeconds(1)//每隔1s执行一次                        .repeatForever()).build();//一直执行        //4、Scheduler绑定Job和Trigger,并执行        scheduler.scheduleJob(jobDetail, trigger);        System.out.println("--------scheduler start ! ------------");        scheduler.start();    }}

执行程序,可以看到每1秒执行一次定时任务。

在上述代码中,其中JobQuartz的接口,业务逻辑的实现通过实现该接口来实现。

JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。

TriggerQuartz的触发器,用于通知Scheduler何时去执行对应Job。SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。

CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTriggerCroTrigger更加常用。CroTrigger是基于Cron表达式的。

常见的Cron表达式示例如下:

Java中定时任务的实现方式有哪些

可以看出,基于QuartzCronTrigger可以实现非常丰富的定时任务场景。

5、Spring Task

Spring 3开始,Spring自带了一套定时任务工具Spring-Task,可以把它看成是一个轻量级的Quartz,使用起来十分简单,除Spring相关的包外不需要额外的包,支持注解和配置文件两种形式。通常情况下在Spring体系内,针对简单的定时任务,可直接使用Spring提供的功能。

基于XML配置文件的形式就不再介绍了,直接看基于注解形式的实现。

使用起来非常简单,直接上代码:

@Component("taskJob")public class TaskJob {    @Scheduled(cron = "0 0 3 * * ?")    public void job1() {        System.out.println("通过cron定义的定时任务");    }    @Scheduled(fixedDelay = 1000L)    public void job2() {        System.out.println("通过fixedDelay定义的定时任务");    }    @Scheduled(fixedRate = 1000L)    public void job3() {        System.out.println("通过fixedRate定义的定时任务");    }}

如果是在Spring Boot项目中,需要在启动类上添加@EnableScheduling来开启定时任务。

上述代码中,@Component用于实例化类,这个与定时任务无关。@Scheduled指定该方法是基于定时任务进行执行,具体执行的频次是由cron指定的表达式所决定。关于cron表达式上面CronTrigger所使用的表达式一致。与cron对照的,Spring还提供了fixedDelayfixedRate两种形式的定时任务执行。

5.1 fixedDelay和fixedRate的区别

fixedDelayfixedRate的区别于Timer中的区别很相似。

fixedRate有一个时刻表的概念,在任务启动时,T1、T2、T3就已经排好了执行的时刻,比如1分、2分、3分,当T1的执行时间大于1分钟时,就会造成T2晚点,当T1执行完时T2立即执行。

fixedDelay比较简单,表示上个任务结束,到下个任务开始的时间间隔。无论任务执行花费多少时间,两个任务间的间隔始终是一致的。

5.2 Spring Task的缺点

Spring Task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。

6、分布式任务调度

以上定时任务方案都是针对单机的,只能在单个JVM进程中使用。而现在基本上都是分布式场景,需要一套在分布式环境下高性能、高可用、可扩展的分布式任务调度框架。

6.1 Quartz分布式

首先,Quartz是可以用于分布式场景的,但需要基于数据库的形式。简单来说,quartz的分布式调度策略是以数据库为边界的一种异步策略。各个调度器都遵守一个基于数据库锁的操作规则从而保证了操作的唯一性,同时多个节点的异步运行保证了服务的可靠。

因此,Quartz的分布式方案只解决了任务高可用(减少单点故障)的问题,处理能力瓶颈在数据库,而且没有执行层面的任务分片,无法最大化效率,只能依靠shedulex调度层面做分片,但是调度层做并行分片难以结合实际的运行资源情况做最优的分片。

6.2 轻量级神器XXL-Job

XXL-JOB是一个轻量级分布式任务调度平台。特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展。由调度中心和执行器功能完成定时任务的执行。调度中心负责统一调度,执行器负责接收调度并执行。

针对于中小型项目,此框架运用的比较多。

6.3 其他框架

除此之外,还有Elastic-JobSaturnSIA-TASK等。

Elastic-Job具有高可用的特性,是一个分布式调度解决方案。

Saturn是唯品会开源的一个分布式任务调度平台,在Elastic Job的基础上进行了改造。

SIA-TASK是宜信开源的分布式任务调度平台。

到此,相信大家对“Java中定时任务的实现方式有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java中定时任务的实现方式有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • Java中定时任务的实现方式有哪些
    本篇内容主要讲解“Java中定时任务的实现方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中定时任务的实现方式有哪些”吧!1、线程等待实现先从最原始最简单的方式来讲解。可以先创建...
    99+
    2023-06-25
  • java定时任务实现方式有哪些
    Java中实现定时任务的方式有以下几种:1. 使用Java内置的Timer类,可以通过调度TimerTask来执行任务。Timer提供了简单的任务调度功能,但是不适用于需要精确控制执行时间的任务。2. 使用Java内置的Schedule...
    99+
    2023-08-11
    java
  • java定时任务实现的方式有哪些
    Java中实现定时任务的方式有以下几种:1. Timer类:Java提供了Timer类,可以用来实现简单的定时任务。Timer类允许...
    99+
    2023-08-29
    java
  • Java -- 定时任务实现方式
    在Java开发中,定时任务是一种十分常见的功能. 定时任务是在约定时间内执行的一段程序 如每天凌晨24点备份同步数据,又或者电商平台 30 分钟后自动取消未支付的订单,每隔一个小时拉取一次数据等都需要使用到定时器 批量处理数据:批量统计上个...
    99+
    2023-09-09
    Java Quartz Scheduled Xxl-Job
  • 使用Java实现定时任务的方法有哪些
    使用Java实现定时任务的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 sleep这也是我们最常用的 sleep 休眠大法,不只是当作休眠用,我们还可以利用它很轻松...
    99+
    2023-06-08
  • 定时任务的实现方法有哪些
    本篇内容介绍了“定时任务的实现方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. Linux自带...
    99+
    2024-04-02
  • java实现定时器的方式有哪些
    Java中实现定时器的方式有以下几种:1. java.util.Timer类和java.util.TimerTask类:Timer类...
    99+
    2023-08-25
    java
  • Java中定时任务的6种实现方式
    目录1、线程等待实现2、JDK自带Timer实现2.1 核心方法2.2使用示例2.2.1指定延迟执行一次 2.2.2固定间隔执行2.2.3固定速率执行2.3 schedule与sch...
    99+
    2024-04-02
  • Android实现定时任务的方法有哪些
    Android实现定时任务的方法有以下几种: 使用Handler:可以通过Handler的postDelayed()方法来实现定...
    99+
    2023-10-26
    Android
  • Django定时任务实现方法有哪些
    本篇内容介绍了“Django定时任务实现方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言为了做一些报表,最近需要每日从爱站...
    99+
    2023-06-04
  • linux实现定时任务命令有哪些
    这篇文章主要介绍linux实现定时任务命令有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、at命令at从文件或标准输入中读取命令并在将来的一个时间执行,只执行一次。at的正常执行需要有守护进程atd:#安装a...
    99+
    2023-06-09
  • Java实现定时器的方法有哪些
    在Java中,有多种方式可以实现定时器功能。以下是几种常见的方法:1. Timer类:Java提供了Timer类,可以用来实现简单的...
    99+
    2023-08-08
    Java
  • Java实现定时任务
    本文实例为大家分享了Java实现定时任务的具体代码,供大家参考,具体内容如下 1 使用java.util.Timer 这种方式的定时任务主要用到两个类,Timer 和 TimerTa...
    99+
    2024-04-02
  • Java定时器实现的方式有哪几种
    Java中实现定时器的方式有以下几种:1. 使用Timer类:Timer类是Java提供的一个定时任务调度器。可以使用Timer类来...
    99+
    2023-10-12
    Java
  • python 实现定时任务的四种方式
    目录用Python实现定时任务 用Python实现定时任务的四种方法 利用while True: + sleep()实现定时任务 利用threading.Timer定时器实现定时任务...
    99+
    2024-04-02
  • Python3-定时任务四种实现方式
    老猫最近做一个小程序开发任务,主要负责后台部分开发;根据项目需求老猫需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次;2>商品定时上线;3>定时检测后台服务是否存活; 老猫使用Python去实现这...
    99+
    2023-01-31
    四种 方式
  • Java 实现定时任务的三种方法
    目录1、 sleep 2、Timer 3、ScheduledExecutorService 总结 是的,不用任何框架,用我们朴素的 Java 编程语言就能实现定时任务。 今天,栈长就...
    99+
    2024-04-02
  • Java实现定时任务的方法详解
    目录前言定时任务是什么定时任务的有哪些是实现方式纯手写单线程循环Timer 和它的小伙伴ScheduledExecutorServiceSpring 提供的定时任务总结前言 学过定时...
    99+
    2022-11-13
    Java实现定时任务 Java定时任务
  • Java中Singleton的实现方式有哪些
    本篇文章给大家分享的是有关Java中Singleton的实现方式有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;...
    99+
    2023-06-06
  • Java中怎么实现SpringBoot定时任务
    今天就跟大家聊聊有关Java中怎么实现SpringBoot定时任务,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. SpringBoot--任务:定时任务项目开发中经常需要执行一些...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作