江明涛的博客
Java 线程的休眠与唤醒
Java 线程的休眠与唤醒

Java 线程的休眠与唤醒

Java线程的休眠与唤醒

在Java编程中,线程是一种重要的概念,允许我们同时执行多个任务,提高程序的性能和效率。Java线程的休眠与唤醒是实现多线程编程中常用的技术,它们允许我们控制线程的执行顺序,实现线程之间的协作。

首先,我们来看一下线程的休眠(Sleep)方法。线程的休眠指的是让一个线程暂停执行一段指定的时间。在Java中,我们可以使用Thread类的sleep方法来实现线程的休眠。


try {
Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}

上述代码会使当前线程暂停执行1秒钟。 sleep方法接收一个以毫秒为单位的休眠时间,并抛出一个InterruptedException异常,该异常在另一个线程中调用该线程的interrupt()方法时抛出。我们需要在catch块中捕获该异常并进行相应的处理。

接下来,我们来看一下线程的唤醒(Wake Up)方法。线程的唤醒指的是让一个正在休眠的线程恢复执行。在Java中,我们可以使用Object类的wait和notify方法来实现线程的唤醒。


public class MyThread implements Runnable {
private Object lock;
public MyThread(Object lock) {
this.lock = lock;
}
public void run() {
synchronized(lock) {
try {
System.out.println("线程开始休眠");
lock.wait(); // 线程进入等待状态
System.out.println("线程被唤醒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

上述代码展示了一个简单的线程类实现,其中的run方法中调用了锁对象的wait方法,使线程进入等待状态。在另一个线程中,我们可以使用锁对象的notify方法来唤醒正在等待的线程。


Object lock = new Object();
MyThread thread = new MyThread(lock);
Thread t = new Thread(thread);
t.start();
// 唤醒正在等待的线程
synchronized(lock) {
lock.notify();
}

通过上述代码,我们可以看到在另一个线程中使用了锁对象的notify方法来唤醒正在等待的线程。一旦线程被唤醒,它将从wait方法的调用处继续执行。

Java线程的休眠与唤醒是实现多线程编程中非常重要的技术。它们能够有效地控制线程的执行顺序,实现线程之间的协作。通过适当地使用休眠和唤醒方法,我们可以避免线程之间的竞争条件,提高程序的效率和稳定性。

Java 线程的休眠与唤醒

Java线程的休眠与唤醒

在Java编程中,线程是一种重要的概念,它允许我们同时执行多个任务,实现多线程编程的关键是控制线程的休眠和唤醒。本文将介绍Java线程的休眠和唤醒的基本概念,并提供一些示例代码来帮助读者更好地理解这个概念。

线程休眠

在某些情况下,我们希望让线程在一段时间内暂停执行,这时我们可以使用线程的休眠功能。Java中的Sleep()方法可以用来使线程休眠一段时间。

示例代码:

public class SleepThreadExample extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("线程" + Thread.currentThread().getId() + "执行操作" + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        SleepThreadExample thread1 = new SleepThreadExample();
        SleepThreadExample thread2 = new SleepThreadExample();
        thread1.start();
        thread2.start();
    }
}

在上面的示例代码中,我们创建了两个SleepThreadExample对象,然后分别启动了这两个线程。在run()方法中,每个线程都会执行5次操作,并在每次操作之间休眠1秒钟。

当我们运行这段代码时,可以看到两个线程交替执行,每个线程都在执行完一个操作后休眠1秒钟。

线程唤醒

除了让线程休眠一段时间外,我们还可以使用线程的唤醒功能来控制线程的执行。Java中的wait()notify()方法可以用来实现线程的唤醒。

示例代码:

public class WaitNotifyExample {
    public void doSomething() {
        synchronized (this) {
            System.out.println("线程" + Thread.currentThread().getId() + "开始执行操作");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getId() + "继续执行操作");
        }
    }
    public void wakeUp() {
        synchronized (this) {
            notify();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        WaitNotifyExample example = new WaitNotifyExample();
        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                example.doSomething();
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                example.wakeUp();
            }
        });
        thread1.start();
        thread2.start();
    }
}

在上面的示例代码中,我们创建了一个WaitNotifyExample对象,然后创建了两个线程,在一个线程中调用了doSomething()方法,在另一个线程中调用了wakeUp()方法。

doSomething()方法中,线程开始执行某个操作,然后调用wait()方法进入等待状态,直到其他线程调用notify()方法唤醒它。

wakeUp()方法中,我们使用synchronized关键字确保在调用notify()方法时锁定对象。

运行这段代码时,可以看到线程1在执行doSomething()方法时被唤醒,并继续执行操作。

通过以上示例,我们可以清楚地了解Java线程的休眠与唤醒的基本概念和使用方法。合理地控制线程的休眠和唤醒,可以提高程序的执行效率和灵活性。