-
-
在 Java中,我们有一个重要的概念:同步和异步。同步就是 Java中的线程安全,异步就是 Java中的线程非安全。 在使用 JVM时,我们一般都是用 start ()方法启动一个线程,然后设置时间,比如定时器,定时器是在某个指定的时间执行相应的任务。但是,在实际应用中,我们会遇到一些特殊的场景:比如我们要定时的计算一个数,我们不想每次都去执行 sleep ()或者 wait ()方法。 此时,如果我们不用定时器,而是直接使用计时器,这个时候计时器就会开始计时;如果要使用定时器来计算一个数,那么定时器就会暂停计时。下面我们来看一个简单的例子。
-
1、初始化
下面我们来看下初始化,首先,我们先来看一下定时器怎么初始化: 上面这个代码是通过循环来进行的,每执行一次循环就会执行一个线程,当线程运行到某个值时,它就会停止。而这个值是定时器里面的 current类中的一个方法: 那么如何获取 current类中的一个方法呢? 上面的代码是通过循环来进行的,这里我们将 current类中的 decrease方法拿出来,然后利用这个方法来获取 current类中的一个方法: 当获取到 current类中的一个方法后,我们可以将其注册到 runtime里面。下面我们来看一下这个 current类中的 decrease方法: 上面的代码是通过循环来进行初始化的,下面我们再看一下它是如何运行起来的:
-
2、暂停计时
上面的代码使用了一个 sleep ()方法来进行定时器的暂停,当我们不想执行 sleep ()方法时,就可以直接使用计时器,这样一来,如果使用计时器的话,就会暂停计时,从而避免了中断任务。 但实际上,我们还可以使用 run ()方法来进行暂停计时。run ()方法也是用来启动一个线程的,不过和上面的代码不同的是: run ()方法并不是调用 start ()方法,而是调用了 run ()。 Run ()方法。 run ()方法就是通过调用当前线程的 start ()方法来启动一个新的线程。然后在 run ()方法中设置好定时器的时间,当定时器的时间到了后就会执行相应的任务。 使用上面的例子可以发现:我们其实是不用通过 start ()来启动新线程的。这样就避免了中断任务;而且如果我们直接调用定时器来执行任务的话,也会比直接使用计时器更加高效。 另外, java中还有一个叫做 synchronized的方法,它和 start ()、 run ()有很大的区别。 synchronized是用来在线程之间传递参数的,也就是说 java中所有线程都可以调用 synchronized,当某个线程调用 synchronized时,其他线程就不能再执行这个任务了。
-
3、重置
如果我们在上面的例子中,使用了 undefined ()方法,那么这个时候我们就可以使用重置计时器来进行重置了。 我们首先定义一个对象,这个对象代表的是一个定时器,然后在对象内部的java.util.co ncur rent. thread方法中定义一个计时函数。 然后在循环中,当当前计时的值小于等于0的时候,我们就停止计时。如果当前计时值大于0,那么我们就继续计时。此时,如果当前计时器执行的是 wait ()方法,那么该方法将会一直等待执行。 接下来我们看一下重置计时器的使用场景: 上面的代码主要是使用重置计时器来实现计时器和定时器中断两个功能,我们只需要设置两个参数就可以了。
-
4、返回
上面的代码是不是很简单,而且我们只需要调用一个定时器,就能实现计时、暂停和返回三个功能。这其实很容易理解,因为我们只要设置好一个定时器的时间,就能完成定时任务,并且将结果返回给用户。 其实在 Java中,除了上述的三种功能外,还有很多其他的定时方法。上面代码中,我们在 java. util. TimerCount方法中设置了一个定时器的时间和数量。当时间到达后,就会执行 wait ()方法,在此之前的定时器不会执行任何操作。而如果设置的时间还没有到达,就会调用 sleep ()方法。在 sleep ()方法中,我们也可以设置定时器的时间和数量,例如设置一个小时,然后再定时器中计时。 上面的代码中,我们使用了一个 readLine ()方法来获取一个数的数值。当这个数为0时,会调用 wait ()方法来停止计时。但是我们使用了一个定时器来计时。因为如果使用 sleep ()方法计算出的结果是0的话,那么这个数就无法计算出来。 在上面的例子中:定时器用来计算一个数时;使用了 sleep ()和 wait ()方法来暂停计时;而在计算完后又使用了 readLine ()方法来返回结果。 以上就是 Java中使用定时器的简单方法和效果。如果有什么不明白的地方,可以在下方评论留言!
-
5、总结
在使用 JVM时,我们经常需要设置一个计时器,但是,在实际应用中,我们会遇到一些特殊的场景。如果不使用计时器,那么线程就会一直运行下去;如果要使用计时器,那么这个时候就会暂停计时。其实, JVM有两种方式可以让线程停止计时。 第一种是 start ()方法:每次调用 start ()方法时, JVM就会启动一个新的线程,就会暂停计时;当再次调用 start ()方法时, JVM就会重新启动新的线程。 当两个方法都被调用时, JVM就会停止计时。 为了让我们的程序更加稳定,所以 java提供了一些特性。比如: 可以通过 sleep ()和 wait ()来设置等待时间; 可以使用try-catch语句来保证线程安全; 可以通过 synchronized关键字来实现同步; 可以使用try-except关键字来禁止代码中的异常;
-
常用的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() {
int count = 0;
@Override
public void run() {
count++;
System.out.println("计时器已经运行了 " + count + " 秒");
}
}, 0, 1000);
}
}
```
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.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(new Runnable() {
int count = 0;
@Override
public void run() {
count++;
System.out.println("计时器已经运行了 " + count + " 秒");
}
}, 0, 1, TimeUnit.SECONDS);
}
}
```
3. 使用System.currentTimeMillis()实现计时器
```java
public class MyTimer {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int count = 0;
while (true) {
long currentTime = System.currentTimeMillis();
if (currentTime - startTime >= 1000) {
count++;
System.out.println("计时器已经运行了 " + count + " 秒");
startTime = currentTime;
}
}
}
}
```