Java中的暂停和继续
Java是一种面向对象的编程语言,具有高度可靠性和可移植性。在Java中,我们可以使用线程来实现并发执行的程序。线程是Java中的基本执行单元,可以独立运行并与其他线程并发执行。
在某些情况下,我们可能需要暂停和继续线程的执行。例如,当我们需要在执行过程中暂停线程以等待某些资源时,或者当我们想要按特定的顺序执行线程时,我们可以使用暂停和继续操作。
暂停线程的方法
Java中提供了几种方法来暂停线程的执行。
1. 使用Thread.sleep()
Thread.sleep()
是Java中用于使当前线程暂停一段时间的方法。它接受一个以毫秒为单位的参数,并使当前线程休眠指定的时间。
以下是使用Thread.sleep()
暂停线程执行的示例代码:
public class SleepExample implements Runnable {
public void run() {
System.out.println("Thread started");
try {
Thread.sleep(2000); // 暂停2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread resumed");
}
public static void main(String[] args) {
Thread t = new Thread(new SleepExample());
t.start();
}
}
上述代码创建了一个SleepExample
类,实现了Runnable
接口。在run()
方法中,我们通过调用Thread.sleep()
方法暂停线程的执行2秒钟。然后,线程将继续执行并打印"Thread resumed"。
2. 使用wait()
和notify()
另一种暂停线程的方法是使用wait()
和notify()
方法。这两个方法是Object类的成员方法,可以用于线程之间的通信。
wait()
方法使当前线程进入等待状态,并释放对象的锁。notify()
方法用于唤醒正在等待的线程。
以下是使用wait()
和notify()
暂停和恢复线程执行的示例代码:
public class WaitNotifyExample {
public static void main(String[] args) {
final Object lock = new Object();
// 线程1
Thread t1 = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
System.out.println("Thread 1 started");
try {
lock.wait(); // 等待其他线程的通知
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 resumed");
}
}
});
// 线程2
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
System.out.println("Thread 2 started");
try {
Thread.sleep(2000); // 暂停2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.notify(); // 通知等待的线程
System.out.println("Thread 2 finished");
}
}
});
t1.start();
t2.start();
}
}
上述代码创建了一个WaitNotifyExample
类,其中包含两个线程t1
和t2
。在t1
线程中,我们使用wait()
方法暂停线程的执行,并等待其他线程的通知。在t2
线程中,我们使用Thread.sleep()
方法暂停线程的执行2秒钟,然后通过notify()
方法通知等待的线程,使其继续执行。
继续线程的方法
在Java中,线程的继续执行可以通过唤醒等待的线程来实现。
使用notify()
和notifyAll()
我们可以使用notify()
方法来唤醒一个正在等待的线程,或使用notifyAll()
方法来唤醒所有等待的线程。
以下是使用notify()
方法继续线程执行的示例代码:
public class NotifyExample {
public static void main(String[] args) {
final Object lock = new Object();
// 线程1
Thread t1 = new Thread(new Runnable() {
public void run() {
synchronized(lock) {
System.out.println("Thread 1 started");
try {
lock.wait(); // 等待其他线程的通知