目录
Java实现定时器的方法有很多,本章主要浅谈一下知道的几种方法:
1、Timer和TimerTask是java.util包下的类,用于实现定时任务
步骤1:创建TimerTask定时器任务,可以通过匿名内部类的方式创建
步骤2:创建Timer定时器,调用定时器的方法执行定时器任务
2、Timer的两个方法schedule()和scheduleAtFixedRate()及其重载方法:
void schedule(TimerTask task, long delay):在指定时间后执行1次任务,其中delay表示时延,单位是毫秒,设置为1000,则表示1秒后执行一次定时器任务;
void schedule(TimerTask task, long delay, long period):指定延迟指定时间后周期性地执行任务(delay毫秒后,每period毫秒执行一次)
void scheduleAtFixedRate(TimerTask task, long delay, long period):指定延迟指定时间后周期性地执行任务(delay毫秒后,每period毫秒执行一次)
void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) :从指定日期firstTime开始,每period毫秒执行一次任务
3、案例代码
public class TimerExample {
public static void main(String[] args) {
// 创建定时器
Timer timer = new Timer();
// 创建定时器任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Hello world!");
}
};
timer.schedule(timerTask, 1000); // 1秒后执行一次
timer.schedule(timerTask, 2000, 2000); // 两秒后每两秒执行一次
timer.scheduleAtFixedRate(timerTask, 3000, 3000); // 3秒后每3秒执行一次
timer.scheduleAtFixedRate(task, new Date(), 4000); // 每4秒执行一次
}
}
其中线程池的方法使用和Timer一样,TimeUnit是一个枚举类型,用于指定时间单位,有NANOSECONDS(纳秒)、MICROSECONDS(微秒)、MILISECONDS(毫秒)、SECONDS(秒)、MINUTE(分钟)、HOURS(小时)和DAYS(天)。
案例代码:
public class TimerExample {
public static void main(String[] args) {
// 创建定时器任务
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Hello world!");
}
};
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
scheduledThreadPool.schedule(timerTask, 1000, TimeUnit.MILLISECONDS);
scheduledThreadPool.scheduleAtFixedRate(timerTask, 1000, 1000, TimeUnit.MILLISECONDS);
}
}
步骤1:在springBoot启动类上添加@EnableScheduling注解
@EnableScheduling
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
步骤2:创建一个定时任务类的bean,在类的方法上使用@Schedule注解,通过注解的cron属性设置定时器的属性
@Component
public class TimerTask {
@Scheduled(cron = "0 7 2 26 7 *")
public void task() {
System.out.println("定时任务...");
}
}
以上代码指定在2022年7月26日02:07:00执行一次定时任务,对cron表达式感兴趣的可以去学习了解一下,这里就不介绍了。
步骤1:在pom.xml中添加quartz的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
步骤2:创建quartz的配置类
@Configuration
public class QuartzConfig {
// 创建一个JobDetail(工作详情)类对象,保存到Spring容器中,这个类用于封装我们编写的job接口实现类
@Bean
public JobDetail jobDetail(){
System.out.println("showTime方法运行");
return JobBuilder.newJob(QuartzJob.class) // 绑定要运行的任务类的类对象
.withIdentity("job") // 设置job的名称
.storeDurably() // 信息持久
// 设置storeDurably之后,当没有触发器指向这个JobDetail时,JobDetail也不会从
// Spring容器中删除,如果不设置这行,就会自动从Spring容器中删除
.build();
}
// 声明触发器,触发器决定我们的工作\任务何时触发
@Bean
public Trigger trigger(){
System.out.println("showTime触发器运行");
// 定义Cron表达式,每分钟触发一次
CronScheduleBuilder cronScheduleBuilder =
CronScheduleBuilder.cronSchedule("0/10 * * * * ?");
return TriggerBuilder.newTrigger()
.forJob(jobDetail()) // 绑定JobDetail对象
.withIdentity("trigger") // 定义触发器名称
.withSchedule(cronScheduleBuilder) // 绑定Cron表达式
.build();
}
}
步骤:3:定义Job
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) {
// 输出当前时间
System.out.println(LocalDateTime.now());
}
} 我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)