专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java添加延迟执行的方法

Java添加延迟执行的方法

更新时间:2022-12-09 11:21:12 来源:星辉 浏览3649次

与任何其他编程语言一样,Java 支持延迟。要理解延迟的概念,我们需要了解Java线程,了解线程后,您肯定会了解 main Thread,即调用 main 函数的线程。所以现在如果我们想使用延迟,唯一可能的方法就是暂停线程的执行。Java 的 API 为这个功能提供了方法。

最基本的方法:Thread 类的 Sleep() 方法

顾名思义,sleep 方法是一种在 Java 中执行延迟的快速但肮脏的方法。此方法存在于 Thread 类中。它只是指示当前线程休眠一段特定时间。

句法:

Thread.Sleep(<Time In Miliseconds>)

sleep 方法以毫秒为单位接受输入。所以,如果你想暂停执行 5 秒,你需要在 sleep 方法中传递 5000。在睡眠方法的情况下,该过程显示为正在进行的工作,而操作设置为暂停。现在,在这种情况下,如果处理器需要处理其他一些高优先级进程,则 sleep 方法的执行可能会被中断。因此,为此目的,Java 的 API 实现了 sleep 方法以抛出 InterruptedException。

下面是Thread类的sleep方法的实现。

public static void sleep(long ms) throws InterruptedException
{
sleep(ms, 0);
}

因此,每当我们调用 sleep 方法时,我们都需要转发异常或使用 try & catch 块处理异常,如下面的代码所示:

try {
Thread.sleep(timeInSeconds * 1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}

以单位时间休眠:Time Unit 的 sleep() 方法

执行或调用睡眠方法的另一种方法是使用 TimeUnit 的睡眠方法。在内部它也使用 Thread 的 sleep 方法,但它的不同之处在于它接受 Unit Time 并且可以在参数中传递相同的方法,如下所示:

句法:

TimeUnit.SECONDS.sleep(<timeInSeconds>);

例子:

// TimeUnit's sleep() method
import java.util.concurrent.*;
class TimeUnitMain{
public static void main(String args[]) {
long time = 0;
//TimeUnit Object to call the sleep method
TimeUnit time = TimeUnit.SECONDS;
try {
// Calling the sleep method on the object of TimeUnit Class
time.sleep(time);
} catch (InterruptedException e) {
System.out.println("Interrupted Exception Caught"+ e);
}
}
}

另一种延迟方法:wait() 方法

我们可以使用 wait 方法在多线程环境和同步块内暂停执行。

像 wait() 一样,我们有一个方法 notify() 和 notifyAll(),这些方法在 wait() 方法之后被调用。我们需要确保我们只从同步块调用 wait() 方法。

让我们看一个简单的例子,在下面的例子中,我们使用线程计算前 100 个数字的总和,并在不同的线程中打印总和。

所以,下面是我们的 ThreadOne 类:

package delay.example;
public class ThreadOne extends Thread{
    int sum;
    @Override
    public void run(){
        synchronized(this){
            for(int i=0; i<100 ; i++){
             sum += i;
            }
            notify();
        }
    }
}

下面是创建 ThreadOne 对象并计算总和的主类:

package delay.example;
public class ThreadMain {
public static void main(String[] args){
ThreadOne t1 = new ThreadOne();
t1.start();
System.out.println("Value of the ThreadOne's num is:  " + t1.sum);
}
}

上述代码的输出如下所示:

ThreadOne 的 num 值为:0

或者

ThreadOne 的 num 值是:10或其他值,具体取决于将变量 sum 发送到控制台进行打印时的值。

我们使用相同的 ThreadOne 类:

package delay.example; 
public class ThreadOne extends Thread{
    int sum;
    @Override
    public void run(){
        synchronized(this){
            for(int i=0; i<100 ; i++){
             sum += i;
            }
            notify();
        }
    }
}

但是修改 ThreadMain 类如下:

package delay.example;
public class ThreadMain {
public static void main(String[] args){
ThreadOne t1 = new ThreadOne();
t1.start();
synchronized(t1){
try{
System.out.println("Waiting For the Thread t1 to complete its execution: ");
t1.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Value of the ThreadOne's num is:  " + t1.sum);
}
}
}

输出:

等待线程 t1 完成执行:

ThreadOne 的 num 值为:4950

这是由于 wait() 暂停了 main() 线程,直到 t1 线程执行它的方法并调用了 notify() 方法。如果大家想了解更多相关知识,不妨来关注一下本站的Java视频教程,里面的课程内容细致全面,通俗易懂,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>