JAVA --- sleep、join、yield方法有什么区别?

在Java中,sleepjoinyield方法都是用于线程控制的方法,但它们的作用和使用场景有所不同。

sleep方法是让当前线程暂停执行一段指定的时间,不会释放锁,时间到了自动唤醒。join方法是等待调用该方法的线程终止,可以带超时参数,用于线程之间的同步。yield方法是提示调度器当前线程愿意让出CPU时间片,不会释放锁,不会导致线程进入睡眠或等待状态。

以下是它们的详细对比:

Thread.sleep 方法

  1. 作用

    • sleep方法是Thread类的静态方法,用于让当前正在执行的线程暂停执行一段指定的时间。
  2. 特点

    • sleep方法不会释放任何锁或监视器。
    • 线程在睡眠期间仍然持有它所获得的锁。
    • sleep方法在指定的时间后自动唤醒。
  3. 使用场景

    • 用于简单的定时任务,比如延迟执行某个操作。

Thread.join 方法

  1. 作用

    • join方法是Thread类的实例方法,用于等待调用该方法的线程终止。
  2. 特点

    • 当一个线程调用另一个线程的join方法时,调用线程会阻塞,直到被调用的线程终止。
    • join方法可以带一个超时参数,表示最多等待指定的时间。
  3. 使用场景

    • 用于线程之间的同步,比如确保某个线程在另一个线程完成之前不会继续执行。

Thread.yield 方法

  1. 作用

    • yield方法是Thread类的静态方法,用于提示调度器当前线程愿意让出CPU时间片。
  2. 特点

    • yield方法只是建议调度器可以重新调度其他线程,但调度器不一定会采纳这个建议。
    • yield方法不会释放任何锁或监视器。
    • yield方法不会导致线程进入睡眠或等待状态,线程仍然处于可运行状态。
  3. 使用场景

    • 用于优化CPU时间片的分配,特别是在多线程环境中,避免某个线程长时间占用CPU。

示例代码

Thread.sleep 示例
public class SleepExample {
    public static void main(String[] args) {
        try {
            System.out.println("Thread is going to sleep.");
            Thread.sleep(2000); // 线程睡眠2秒
            System.out.println("Thread woke up.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Thread.join 示例
public class JoinExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            try {
                System.out.println("Thread 1 is running.");
                Thread.sleep(2000);
                System.out.println("Thread 1 is done.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                System.out.println("Thread 2 is waiting for Thread 1 to finish.");
                thread1.join();
                System.out.println("Thread 2 is running.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        thread1.start();
        thread2.start();
    }
}
Thread.yield 示例
public class YieldExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 1: " + i);
                Thread.yield(); // 提示调度器让出CPU时间片
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 2: " + i);
                Thread.yield(); // 提示调度器让出CPU时间片
            }
        });

        thread1.start();
        thread2.start();
    }
}

总结

  • sleep方法:用于让当前线程暂停执行一段指定的时间,不会释放锁,时间到了自动唤醒。
  • join方法:用于等待调用该方法的线程终止,可以带超时参数,用于线程之间的同步。
  • yield方法:用于提示调度器当前线程愿意让出CPU时间片,不会释放锁,不会导致线程进入睡眠或等待状态。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值