大家在工作中,常常会遇到一些突发的工作,需要在短时间内完成。这就要求我们能够快速的处理这些突发事件,但是如果直接调用方法来做,时间太长了,会导致程序变得臃肿。那么有没有什么好的办法呢?下面我们就来看下 java中是如何实现定时器的。 在 Java中有很多方法可以实现定时器,其中比较常见的就是 counter和 notify,它们都可以用来设置时间,并且实现了一种功能叫做 arr。 其中 arr ()方法在很多地方都可以用到,在这里面我们主要讲的是 setTimeout方法。setTimeout是一个定时器,当时间达到时,就会抛出一个异常。这个方法在平时的工作中使用非常多。
-
一、功能介绍
上面的代码中,我们可以看到在 setTimeout方法中,会给出一个时间的值,并且这个时间是由线程来执行的,所以我们可以根据这个时间值来设置线程的执行顺序。 1. setTimeout ()方法的参数是一个内置的常量,表示一个变量,也就是一个方法。该方法会在当前线程执行完毕时自动释放。在这个方法中,首先会先创建一个 static对象,然后用来存储这个常量。由于我们设置了一个时间,所以这个常量会被阻塞。 2. setTimeout ()方法可以设置在指定时间之后,线程才会开始执行。由于是在指定时间之后才开始执行,所以不会出现超时的情况。 3.当线程执行完毕后,会对当前线程的状态进行更新,并且为我们创建一个新的常量对象。在这个对象中,有一个 dump方法,里面会把所有线程中保存的常量进行汇总。 4.当调用 setTimeout ()方法时,不需要重新初始化这个常量。 5.在运行过程中,如果出现异常,将会抛出一个异常。 6.最后提醒大家一下: setTimeout方法有很多种用法,在这里我们选择了最常见的一种使用方法: 当 setTimeout方法执行完后,就会调用 new System ()函数来创建一个新的对象。当新对象创建完毕后就会进行初始化,在这个过程中调用 setTimeout ()方法会抛出一个异常。当抛出异常后就可以停止这个线程的运行。
-
二、实现原理
下面我们来看看 setTimeout方法的实现原理。 setTimeout方法的第一个参数是定时器数组,这个数组是在 java. util. TimeData包中定义的。这里面包括了一个 timestamp数组,以及一个 time参数,这里需要注意的是 time参数,在 setTimeout方法中是一个不带参数的 time参数,这个 time参数是用来设置定时器数组所需的时间,而不是用来设置定时器的时间。然后就是一个数组,这里就不解释了。 第二个参数是返回值,当定时器设置好之后,返回值就是一个 timestamp数组。当达到时间点时,会抛出一个异常来停止定时器工作。 如果要实现多线程的定时器,可以在 setTimeout方法中加入多个线程。这样可以多个线程一起工作,并不会出现任务积压的情况。然后在多线程的状态下, setTimeout方法可以设置定时器退出的时间,如果在设定的时间内没有执行完任务的话,就会抛出异常。 如果我们有多个任务要完成,但是每一个任务都要执行很久才能完成的话,就可以使用多线程来配合完成。首先我们要先定义一个线程,在这个线程里面可以放两个定时器。 第一个定时器叫做 timestamp数组,这个数组包含了一个 time参数。接着我们把第一个定时器设置好之后就可以使用第二个定时器了。这个第二个定时器和第一个定时器是一样的,只是在 timestamp数组中添加了一个 timestamp数组元素。接下来就是执行的问题了。 第一个线程设置好 timestamp之后,把第二个定时器设为 timestamp数组的最后一个元素,然后启动第二个定时器执行任务就行了。如果第一个定时器没有执行完任务的话,那么就会抛出异常来终止定时器工作了。
-
三、示例代码
示例代码的源码中,有两个变量,一个是 counter,一个是 setTimeout。首先,我们先创建一个空的变量。我们需要设置一个时间为60秒。这个变量就是 counter变量,可以设置成具体的时间点。 下面我们来创建一个 setTimeout变量,这个变量需要在第一次调用 setTimeout方法时创建。 首先我们对上面的代码进行封装,使其在第一次调用 setTimeout方法时,就创建了一个新的变量。下面是封装后的代码: 我们发现如果用 counter方法来设置时间的话,会抛出异常,因此我们在上面设置了一个 notify方法来设置时间。 上面是创建新变量 setTimeout的代码,下面是对这个变量进行初始化的代码: 在这里我们需要注意两点: 第一点是 setTimeout方法一定要在第一次调用时创建。如果不创建这个变量的话,程序在运行过程中,这个变量就会抛出异常。 第二点是 notify方法不能重复调用。因为当调用了 notify方法后,程序就会终止运行。如果要再次调用该方法的话,程序就会抛出一个异常。 下面我们来看下 notify的效果: 上面这段代码是不是很简单呢?通过上面的操作,我们可以把所有的时间都设置好了。在这个例子中,如果时间已经到了60秒,那么就会抛出异常。这样就可以很快的处理突发事件了。 以上就是 java中实现定时器的方法了,希望对大家有所帮助!最后给大家分享一个免费的学习资料:《Java核心技术要点》(最新版)资料领取入口!
-
四、总结
最后我们再来回顾下之前讲过的内容: java中的时间是以毫秒为单位的,我们在设置好一个时间以后,程序会自动把这个时间转换为一毫秒。另外,当我们需要修改某个变量的值时,也是要用到这个方法的,比如设置一个变量的初始值为1,而现在修改了变量的值,那么这个变量会被转换为0.1或者0.01。 在定时器中,有一个重要的参数叫做 top ()方法,当我们调用它的时候会产生一个异常。当我们给这个方法设置时间时,如果时间达到了就会抛出一个异常。 最后我们总结一下: 1、 counter和 notify都是可以实现定时器的。notify是使用 arr ()方法来设置时间,而 counter使用 setTimeout方法来设置时间。 2、 setTimeout方法在程序运行中会抛出一个异常,这个异常可以通过调用 notify方法来释放内存。
常用的java定时器代码如下:
1. 使用Timer类实现定时器
```java
import java.util.Timer;
import java.util.TimerTask;
public class MyTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时器任务执行了");
}
}, 1000, 2000);
}
}
```
上述代码中,使用Timer类创建定时器,schedule方法可以设置定时器任务的执行时间和间隔时间。
2. 使用ScheduledExecutorService类实现定时器
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MyTimer {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("定时器任务执行了");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}
```
上述代码中,使用ScheduledExecutorService类创建定时器,scheduleAtFixedRate方法可以设置定时器任务的执行时间和间隔时间。
3. 使用Spring的@Scheduled注解实现定时器
```java
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyTimer {
@Scheduled(initialDelay = 1000, fixedDelay = 2000)
public void timerTask() {
System.out.println("定时器任务执行了");
}
}
```
上述代码中,使用Spring的@Scheduled注解创建定时器,initialDelay属性可以设置定时器任务的初始延迟时间,fixedDelay属性可以设置定时器任务的间隔时间。需要在Spring配置文件中开启定时器功能。