侧边栏壁纸
博主头像
IT充电站博主等级

看过故人终场戏,淡抹最适宜

  • 累计撰写 48 篇文章
  • 累计创建 13 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

线程start/run/wait/sleep/notify/notifyAll的区别

陈汉林
2024-05-23 / 0 评论 / 0 点赞 / 7 阅读 / 3085 字

1. start()

  • 作用:启动一个线程。当调用一个线程的 start() 方法时,线程会被创建并开始执行其 run() 方法。

  • 使用场景:当你需要启动一个新的线程时使用。

2. run()

  • 作用run() 方法是 Runnable 接口的一部分,它定义了线程执行的具体任务。在 Thread 类中,run() 方法是一个空的实现,可以被重写以包含线程的逻辑。

  • 使用场景:定义线程要执行的任务。

3. wait()

  • 作用wait() 方法属于 Object 类,当一个线程执行到 wait() 方法时,它会释放对象的锁(如果有的话),然后让出CPU资源,并进入等待阻塞状态,直到另一个线程调用相同对象的 notify()notifyAll() 方法。

  • 使用场景:用于线程间的协调,确保线程在某个条件满足之前等待。

4. sleep()

  • 作用sleep() 方法属于 Thread 类,它使得当前线程暂停执行指定的时间长度,让出CPU资源给其他线程,但不释放对象的锁。

  • 使用场景:用于暂停线程的执行,常用于控制程序的执行节奏。

5. notify()

  • 作用notify() 方法属于 Object 类,它唤醒在此对象监视器上等待的单个线程。如果所有线程都超时或正在等待条件变量,则任何一个线程都会被唤醒。

  • 使用场景:与 wait() 配合使用,用于唤醒等待的线程。

6. notifyAll()

  • 作用:与 notify() 类似,但 notifyAll() 方法会唤醒在此对象监视器上等待的所有线程。

  • 使用场景:当需要唤醒所有等待线程时使用。

public class ThreadExample extends Thread {
    public void run() {
        try {
            synchronized (this) {
                System.out.println("Thread " + Thread.currentThread().getName() + " is waiting.");
                wait(); // 调用 wait() 进入等待状态
                System.out.println("Thread " + Thread.currentThread().getName() + " has been notified.");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ThreadExample t = new ThreadExample();
        synchronized (t) {
            t.start(); // 启动线程
            Thread.sleep(1000); // 让新线程进入 wait() 状态
            t.notify(); // 唤醒等待的线程
        }
    }
}

注意说明

  • wait()sleep()notify()notifyAll() 都可能抛出 InterruptedException,需要适当处理。

  • wait()notify()notifyAll() 必须在同步代码块或方法中使用,因为它们需要与对象的监视器(monitor)关联。

  • 通常,sleep() 用于线程的简单暂停,而 wait() 用于更复杂的线程间同步。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区