Java等待命令

在Java编程中,有时候我们需要让程序在某些条件满足时暂停执行,等待一段时间再继续执行。这就涉及到了Java中的等待命令。等待命令可以通过多种方式实现,包括使用线程的睡眠方法、等待、通知等。本文将介绍Java中等待命令的几种实现方式,并给出相应的代码示例。

1. 使用Thread.sleep()方法

在Java中,可以使用Thread.sleep()方法来实现等待一段时间再执行下一步操作。该方法接收一个毫秒数作为参数,表示线程暂停的时间。下面是一个简单的示例:

try {
    Thread.sleep(5000); // 等待5秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

在这个示例中,程序会暂停执行5秒钟,然后继续往下执行。

2. 使用Object.wait()和Object.notify()方法

另一种常见的等待命令实现方式是使用Object.wait()和Object.notify()方法。这两个方法结合起来可以实现线程之间的等待和通知机制。下面是一个简单的示例:

final Object lock = new Object();
Thread t1 = new Thread(() -> {
    synchronized (lock) {
        try {
            lock.wait(); // 等待被唤醒
            System.out.println("Thread 1 woke up");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

Thread t2 = new Thread(() -> {
    synchronized (lock) {
        try {
            Thread.sleep(2000); // 等待2秒
            lock.notify(); // 唤醒线程t1
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

t1.start();
t2.start();

在这个示例中,线程t1会等待被唤醒,而线程t2会在等待2秒后唤醒t1。

3. 使用CountDownLatch类

Java中的CountDownLatch类可以让一个或多个线程等待其他线程完成操作后再执行。下面是一个示例:

CountDownLatch latch = new CountDownLatch(1);

Thread t1 = new Thread(() -> {
    try {
        System.out.println("Thread 1 is waiting");
        latch.await(); // 等待latch计数为0
        System.out.println("Thread 1 is resumed");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

Thread t2 = new Thread(() -> {
    try {
        Thread.sleep(3000); // 等待3秒
        latch.countDown(); // 减少latch计数
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();
t2.start();

在这个示例中,线程t1会等待latch计数为0,而线程t2会在等待3秒后减少latch计数。

4. 使用Semaphore类

Semaphore类是Java中用来控制同时访问特定资源的线程数的工具类。通过acquire()和release()方法,可以实现线程之间的等待和通知。下面是一个示例:

Semaphore semaphore = new Semaphore(0);

Thread t1 = new Thread(() -> {
    try {
        System.out.println("Thread 1 is waiting");
        semaphore.acquire(); // 等待许可
        System.out.println("Thread 1 is resumed");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

Thread t2 = new Thread(() -> {
    try {
        Thread.sleep(3000); // 等待3秒
        semaphore.release(); // 释放许可
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();
t2.start();

在这个示例中,线程t1会等待许可,而线程t2会在等待3秒后释放许可。

总结

在Java编程中,等待命令是一种常见的操作,可以通过多种方式实现。本文介绍了使用Thread.sleep()方法、Object.wait()和Object.notify()方法、CountDownLatch类以及Semaphore类来实现等待命令的几种方式,并给出了相应的代码示例。根据具体的需求和场景,选择合适的等待命令实现方式非常重要