tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
一、sleep 和 wait 的区别
在 Java 中,线程的 "sleep" 和 "wait" 方法区别:
"sleep" 方法是 Thread 类的静态方法,而 "wait" 方法是 Object 类的实例方法。
"sleep" 方法会使线程进入睡眠状态,暂停执行一段时间,然后继续执行;而 "wait" 方法会使线程进入等待状态,直到其他线程调用了该对象的 "notify" 或 "notifyAll" 方法才会继续执行。
"sleep" 方法不会释放线程持有的锁,而 "wait" 方法会释放线程持有的锁。
"sleep" 方法通常用于在一段时间后再次执行任务,或在执行任务之前等待一段时间;而 "wait" 方法通常用于线程间的协作,比如等待其他线程的完成或等待某个条件的满足。
"sleep" 方法的参数是一个时间段,而 "wait" 方法没有参数。
二、使用案例
线程 1 调用了 "sleep" 方法,暂停执行了一秒钟,然后继续执行。线程 2 调用了 "wait" 方法,进入等待状态,直到主线程调用了 lock.notify() 方法,才会继续执行。
注意,线程 2 在调用 "wait" 方法之前必须先获取 lock 对象的锁,否则会抛出 IllegalMonitorStateException 异常。
package com.pany.camp.thread;
public class SleepWait {
public static void main(String[] args) {
final Object lock = new Object();
// 创建一个线程,调用 sleep 方法
Thread thread1 = new Thread(() -> {
System.out.println("Thread 1 started.");
try {
Thread.sleep(1000); // 线程睡眠 1 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 finished.");
});
// 创建一个线程,调用 wait 方法
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 started.");
synchronized (lock) {
try {
lock.wait(); // 线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread 2 finished.");
});
// 启动线程
thread1.start();
thread2.start();
// 等待一段时间
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒线程 2
synchronized (lock) {
lock.notify();
}
}
}