热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Quartz经典入门案列

一、Quartz简介    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDKTi

一、Quartz简介 

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。 

    Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任 务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。 

二、Quartz任务调度 

1. 简单任务调度 

    在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。 

HelloWorldJob.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import org.quartz.Job;  
  4. import org.quartz.JobExecutionContext;  
  5. import org.quartz.JobExecutionException;  
  6.   
  7. public class HelloWorldJob implements Job {  
  8.   
  9.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  10.                   //实现你的业务逻辑  
  11.         System.out.println("Hello!");  
  12.           
  13.     }  
  14. }  



HelloScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.quartz.JobDetail;  
  6. import org.quartz.Scheduler;  
  7. import org.quartz.SimpleTrigger;  
  8. import org.quartz.Trigger;  
  9. import org.quartz.impl.StdSchedulerFactory;  
  10.   
  11. public class HelloScheduling {  
  12.     public static void main(String[] args) throws Exception {  
  13.   
  14.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  15.         scheduler.start();  
  16.   
  17.         JobDetail jobDetail = new JobDetail("helloWorldJob",  
  18.                 Scheduler.DEFAULT_GROUP, HelloWorldJob.class);  
  19.   
  20.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  21.                 Scheduler.DEFAULT_GROUP, new Date(), null,  
  22.                 SimpleTrigger.REPEAT_INDEFINITELY, 1000);  
  23.           
  24.         scheduler.scheduleJob(jobDetail, trigger);  
  25.   
  26.     }  
  27. }  



需要说明几点: 

    1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止 (stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动 scheduler。 

    2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。 

    3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为 空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限 次;第六个是触发器运行的时间间隔,是毫秒数。 

    4)最后通过scheduler.scheduleJob()方法调度任务。 

2. 使用JobDetail传递数据 

    每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。 

MessageJob.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.quartz.Job;  
  6. import org.quartz.JobExecutionContext;  
  7. import org.quartz.JobExecutionException;  
  8.   
  9. public class MessageJob implements Job {  
  10.   
  11.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  12.           
  13.         Map properties = context.getJobDetail().getJobDataMap();  
  14.           
  15.         System.out.println("Previous Fire Time: " + context.getPreviousFireTime());  
  16.         System.out.println("Current Fire Time: " + context.getFireTime());  
  17.         System.out.println("Next Fire Time: " + context.getNextFireTime());  
  18.         System.out.println(properties.get("message"));  
  19.           
  20.     }  
  21. }  



MessageScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5.   
  6. import org.quartz.JobDetail;  
  7. import org.quartz.Scheduler;  
  8. import org.quartz.SimpleTrigger;  
  9. import org.quartz.Trigger;  
  10. import org.quartz.impl.StdSchedulerFactory;  
  11.   
  12. public class MessageScheduling {  
  13.     public static void main(String[] args) throws Exception {  
  14.   
  15.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  16.         scheduler.start();  
  17.   
  18.         JobDetail jobDetail = new JobDetail("messageJob",  
  19.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  20.           
  21.         Map map = jobDetail.getJobDataMap();  
  22.         map.put("message""This is a message from Quartz");  
  23.   
  24.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  25.                 Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),  
  26.                 SimpleTrigger.REPEAT_INDEFINITELY, 5000);  
  27.           
  28.         scheduler.scheduleJob(jobDetail, trigger);  
  29.   
  30.     }  
  31. }  



3. 使用CronTrigger 

   上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。 

    一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html 

   下面举例说明CronTrigger的使用。 

CronWithCalendarScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.Map;  
  6.   
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.JobDetail;  
  9. import org.quartz.Scheduler;  
  10. import org.quartz.SimpleTrigger;  
  11. import org.quartz.Trigger;  
  12. import org.quartz.impl.StdSchedulerFactory;  
  13. import org.quartz.impl.calendar.HolidayCalendar;  
  14.   
  15. public class CronWithCalendarScheduling {  
  16.     public static void main(String[] args) throws Exception {  
  17.   
  18.         Calendar cal = Calendar.getInstance();  
  19.         cal.set(2010, Calendar.OCTOBER, 31);  
  20.           
  21.         HolidayCalendar calendar  = new HolidayCalendar();  
  22.         calendar.addExcludedDate(cal.getTime());  
  23.           
  24.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  25.         scheduler.start();  
  26.           
  27.         scheduler.addCalendar("calendar", calendar, truefalse);  
  28.           
  29.         JobDetail jobDetail = new JobDetail("messageJob",  
  30.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  31.           
  32.         Map map = jobDetail.getJobDataMap();  
  33.         map.put("message""This is a message from Quartz");  
  34.   
  35.         String cronExpression = "3/5 * 17,18,19,20 * * ?";  
  36.           
  37.         Trigger trigger = new CronTrigger("cronTrigger",  
  38.                 Scheduler.DEFAULT_GROUP, cronExpression);  
  39.           
  40.         scheduler.scheduleJob(jobDetail, trigger);  
  41.     }  
  42. }  



需要说明几点: 

    1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。 

    2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。 

三. Spring对Quartz调度的支持 

    Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。 

quartz.xml 

Java代码  Quartz经典入门案列
  1. "1.0" encoding="UTF-8"?>  
  2. "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4.     "job"  
  5.         class="org.springframework.scheduling.quartz.JobDetailBean">  
  6.         "jobClass">  
  7.              com.learnworld.quartz.MessageJob   
  8.           
  9.         "jobDataAsMap">  
  10.               
  11.                 "message">  
  12.                     This is a message from Spring Quartz configuration!  
  13.                   
  14.               
  15.           
  16.       
  17.     "trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  18.         "startDelay">  
  19.             1000  
  20.           
  21.         "repeatInterval">  
  22.             3000  
  23.           
  24.         "jobDetail">  
  25.             "job" />  
  26.           
  27.       
  28.   
  29.     "schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  30.         "triggers">  
  31.               
  32.                 "trigger" />  
  33.               
  34.           
  35.       
  36.   



SimpleSpringQuartzIntegration.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.   
  6. public class SimpleSpringQuartzIntegration {  
  7.   
  8.     public static void main(String[] args) {  
  9.   
  10.         ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");  
  11.     }  
  12.   
  13. }  



需要说明几点: 

    1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。 

    2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。 

    3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实 例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承 SchedulerFactory接口来实现你自己的版本。

引入的jar包:

Quartz经典入门案列

一、Quartz简介 

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。 

    Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任 务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。 

二、Quartz任务调度 

1. 简单任务调度 

    在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。 

HelloWorldJob.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import org.quartz.Job;  
  4. import org.quartz.JobExecutionContext;  
  5. import org.quartz.JobExecutionException;  
  6.   
  7. public class HelloWorldJob implements Job {  
  8.   
  9.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  10.                   //实现你的业务逻辑  
  11.         System.out.println("Hello!");  
  12.           
  13.     }  
  14. }  



HelloScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.quartz.JobDetail;  
  6. import org.quartz.Scheduler;  
  7. import org.quartz.SimpleTrigger;  
  8. import org.quartz.Trigger;  
  9. import org.quartz.impl.StdSchedulerFactory;  
  10.   
  11. public class HelloScheduling {  
  12.     public static void main(String[] args) throws Exception {  
  13.   
  14.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  15.         scheduler.start();  
  16.   
  17.         JobDetail jobDetail = new JobDetail("helloWorldJob",  
  18.                 Scheduler.DEFAULT_GROUP, HelloWorldJob.class);  
  19.   
  20.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  21.                 Scheduler.DEFAULT_GROUP, new Date(), null,  
  22.                 SimpleTrigger.REPEAT_INDEFINITELY, 1000);  
  23.           
  24.         scheduler.scheduleJob(jobDetail, trigger);  
  25.   
  26.     }  
  27. }  



需要说明几点: 

    1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止 (stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动 scheduler。 

    2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。 

    3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为 空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限 次;第六个是触发器运行的时间间隔,是毫秒数。 

    4)最后通过scheduler.scheduleJob()方法调度任务。 

2. 使用JobDetail传递数据 

    每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。 

MessageJob.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.quartz.Job;  
  6. import org.quartz.JobExecutionContext;  
  7. import org.quartz.JobExecutionException;  
  8.   
  9. public class MessageJob implements Job {  
  10.   
  11.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  12.           
  13.         Map properties = context.getJobDetail().getJobDataMap();  
  14.           
  15.         System.out.println("Previous Fire Time: " + context.getPreviousFireTime());  
  16.         System.out.println("Current Fire Time: " + context.getFireTime());  
  17.         System.out.println("Next Fire Time: " + context.getNextFireTime());  
  18.         System.out.println(properties.get("message"));  
  19.           
  20.     }  
  21. }  



MessageScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Map;  
  5.   
  6. import org.quartz.JobDetail;  
  7. import org.quartz.Scheduler;  
  8. import org.quartz.SimpleTrigger;  
  9. import org.quartz.Trigger;  
  10. import org.quartz.impl.StdSchedulerFactory;  
  11.   
  12. public class MessageScheduling {  
  13.     public static void main(String[] args) throws Exception {  
  14.   
  15.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  16.         scheduler.start();  
  17.   
  18.         JobDetail jobDetail = new JobDetail("messageJob",  
  19.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  20.           
  21.         Map map = jobDetail.getJobDataMap();  
  22.         map.put("message""This is a message from Quartz");  
  23.   
  24.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
  25.                 Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),  
  26.                 SimpleTrigger.REPEAT_INDEFINITELY, 5000);  
  27.           
  28.         scheduler.scheduleJob(jobDetail, trigger);  
  29.   
  30.     }  
  31. }  



3. 使用CronTrigger 

   上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。 

    一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html 

   下面举例说明CronTrigger的使用。 

CronWithCalendarScheduling.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.Map;  
  6.   
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.JobDetail;  
  9. import org.quartz.Scheduler;  
  10. import org.quartz.SimpleTrigger;  
  11. import org.quartz.Trigger;  
  12. import org.quartz.impl.StdSchedulerFactory;  
  13. import org.quartz.impl.calendar.HolidayCalendar;  
  14.   
  15. public class CronWithCalendarScheduling {  
  16.     public static void main(String[] args) throws Exception {  
  17.   
  18.         Calendar cal = Calendar.getInstance();  
  19.         cal.set(2010, Calendar.OCTOBER, 31);  
  20.           
  21.         HolidayCalendar calendar  = new HolidayCalendar();  
  22.         calendar.addExcludedDate(cal.getTime());  
  23.           
  24.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
  25.         scheduler.start();  
  26.           
  27.         scheduler.addCalendar("calendar", calendar, truefalse);  
  28.           
  29.         JobDetail jobDetail = new JobDetail("messageJob",  
  30.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
  31.           
  32.         Map map = jobDetail.getJobDataMap();  
  33.         map.put("message""This is a message from Quartz");  
  34.   
  35.         String cronExpression = "3/5 * 17,18,19,20 * * ?";  
  36.           
  37.         Trigger trigger = new CronTrigger("cronTrigger",  
  38.                 Scheduler.DEFAULT_GROUP, cronExpression);  
  39.           
  40.         scheduler.scheduleJob(jobDetail, trigger);  
  41.     }  
  42. }  



需要说明几点: 

    1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。 

    2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。 

三. Spring对Quartz调度的支持 

    Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。 

quartz.xml 

Java代码  Quartz经典入门案列
  1. "1.0" encoding="UTF-8"?>  
  2. "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4.     "job"  
  5.         class="org.springframework.scheduling.quartz.JobDetailBean">  
  6.         "jobClass">  
  7.              com.learnworld.quartz.MessageJob   
  8.           
  9.         "jobDataAsMap">  
  10.               
  11.                 "message">  
  12.                     This is a message from Spring Quartz configuration!  
  13.                   
  14.               
  15.           
  16.       
  17.     "trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  18.         "startDelay">  
  19.             1000  
  20.           
  21.         "repeatInterval">  
  22.             3000  
  23.           
  24.         "jobDetail">  
  25.             "job" />  
  26.           
  27.       
  28.   
  29.     "schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  30.         "triggers">  
  31.               
  32.                 "trigger" />  
  33.               
  34.           
  35.       
  36.   



SimpleSpringQuartzIntegration.java 

Java代码  Quartz经典入门案列
  1. package com.learnworld.quartz;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.   
  6. public class SimpleSpringQuartzIntegration {  
  7.   
  8.     public static void main(String[] args) {  
  9.   
  10.         ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");  
  11.     }  
  12.   
  13. }  



需要说明几点: 

    1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。 

    2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。 

    3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实 例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承 SchedulerFactory接口来实现你自己的版本。

引入的jar包:

Quartz经典入门案列


推荐阅读
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在C#编程中,设计流畅的用户界面是一项重要的任务。本文分享了实现Fluent界面设计的技巧与方法,特别是通过编写领域特定语言(DSL)来简化字符串操作。我们探讨了如何在不使用`+`符号的情况下,通过方法链式调用来组合字符串,从而提高代码的可读性和维护性。文章还介绍了如何利用静态方法和扩展方法来实现这一目标,并提供了一些实用的示例代码。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
mobiledu2502914997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有