timeunit.seconds.sleep 和 Thread.sleep
时间: 2024-06-07 16:12:20 浏览: 21
TimeUnit.SECONDS.sleep()和Thread.sleep()都可以用于暂停当前线程的执行,但它们有一些不同之处。
TimeUnit.SECONDS.sleep()是java.util.concurrent包下的类方法,底层调用的是Thread.sleep()。它接收的参数是秒数,会自动将秒数转换为毫秒,并调用Thread.sleep()方法来实现暂停。这样就避免了手动计算毫秒数的麻烦。
Thread.sleep()是java.lang包下的类方法,接收的参数是毫秒数。如果需要暂停的时间是秒、分、小时等单位,需要手动将这些单位转换为毫秒数,然后调用Thread.sleep()方法。
总结来说,TimeUnit.SECONDS.sleep()是对Thread.sleep()方法的包装,提供了时间单位转换和验证的功能。它的使用更加简便,可读性更好。而Thread.sleep()方法则需要手动计算毫秒数,稍微繁琐一些。
相关问题
TimeUnit.SECONDS
`TimeUnit.SECONDS` 是一个枚举类型,代表时间单位为秒。它是 Java 标准库中的一个时间单位枚举类型,主要用于在多线程编程中指定时间的单位。
在 Java 中,我们通常使用 `Thread.sleep()` 方法来让线程休眠一段时间。这个方法接受一个毫秒数作为参数,表示线程需要休眠的时间。如果我们需要让线程休眠一段时间,但时间单位不是毫秒而是秒,就可以使用 `TimeUnit.SECONDS` 来指定时间单位。
例如,下面的代码让当前线程休眠 5 秒:
```java
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
```
在上面的代码中,我们使用 `TimeUnit.SECONDS.sleep(5)` 方法让当前线程休眠 5 秒。这个方法实际上是调用了 `Thread.sleep(5000)` 方法,只不过时间单位是秒而不是毫秒。
countDownLatch.await(10, TimeUnit.SECONDS);使用案例
CountDownLatch.await(long timeout, TimeUnit unit) 方法可以让等待线程在指定的时间内等待其他线程完成任务,如果等待时间超过了指定时间,等待线程将会继续执行。这个方法比 CountDownLatch.await() 更加灵活,可以避免在某些情况下出现线程一直等待的情况。
以下是一个使用 CountDownLatch.await(long timeout, TimeUnit unit) 的案例:
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
int taskCount = 3;
CountDownLatch latch = new CountDownLatch(taskCount);
Thread t1 = new Thread(new Task(latch, 5000));
Thread t2 = new Thread(new Task(latch, 10000));
Thread t3 = new Thread(new Task(latch, 15000));
t1.start();
t2.start();
t3.start();
boolean allTasksFinished = latch.await(10, TimeUnit.SECONDS);
if (allTasksFinished) {
System.out.println("All tasks have finished, now executing main task.");
} else {
System.out.println("Some tasks have not finished within the timeout period, now executing main task.");
}
}
static class Task implements Runnable {
private CountDownLatch latch;
private long sleepTime;
public Task(CountDownLatch latch, long sleepTime) {
this.latch = latch;
this.sleepTime = sleepTime;
}
@Override
public void run() {
try {
System.out.println("Task started: " + Thread.currentThread().getName());
Thread.sleep(sleepTime);
System.out.println("Task finished: " + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}
}
}
```
在上面的例子中,我们创建了一个 CountDownLatch 对象并设置了计数器的初始值为 3。然后创建了 3 个线程分别执行不同时间的任务。在等待其他线程完成任务时,我们使用了 CountDownLatch.await(10, TimeUnit.SECONDS) 方法,表示等待 10 秒钟,如果其他线程在这个时间内没有完成任务,等待线程将会继续执行。当所有任务都执行完毕时,主任务将会开始执行。