`

线程中各种唤醒、等待、睡眠方法之间的区别

阅读更多
一、notify()方法和notifyAll()方法的区别

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。


二、sleep()方法和yield()方法和wait()方法之间的区别

sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常。比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有 锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。


三、suspend() 和 resume() 方法之间的区别

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。
分享到:
评论

相关推荐

    唤醒阻塞休眠线程示例

    每个`Lock`实例可以有多个条件变量,允许线程在特定条件下等待,并由其他线程唤醒。 8. **信号量(Semaphore)**:信号量是一种同步工具,允许多个线程同时访问有限资源。它可以用来控制进入某临界区的线程数量,当...

    线程池使用介绍用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态

    在应用程序中,多个线程可能会处于等待状态,等待某个事件的发生或者进行周期性的状态检查,这样的操作会消耗资源,因为线程即使在休眠也需要占用内存。线程池通过集中管理这些线程,减少了创建和销毁线程的开销,...

    Java多线程--等待所有子线程执行完的五种方法.docx

    这种方法的问题在于,睡眠时间必须预估,且不准确,可能导致主线程提前唤醒或过度等待。 ### 方法二:`Thread.join()`方法 `Thread.join()`方法允许主线程等待特定线程结束。例如,如果有多个子线程,我们可以在每...

    线程的几个重要方法.doc

    本文将详细讲解Java中线程的几个关键方法及其应用场景。 1. `run()`方法 `run()`方法是线程执行的主要逻辑所在。当创建一个线程并调用`start()`方法时,Java虚拟机(JVM)会自动调用`run()`方法。`run()`方法必须是`...

    Java线程:线程状态的转换

    4. **等待/阻塞/睡眠状态(Waiting/Blocked/Sleeping)**:这是线程的一种非活跃状态,其中三种状态的主要区别在于线程为何停止运行: - **等待状态(Waiting)**:通常是因为线程调用了某些方法(如`Object.wait()`)...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    例如,Java线程状态中的SLEEPING实际上对应了操作系统线程状态中的WAITING状态之一,即等待睡眠超时。值得注意的是,Java线程状态SLEEPING还包含了等待(WAITING)和带超时的等待(WAITING_WITH_TIMEOUT)状态,这是...

    JAVA多线程操作方法实用大全

    `notify()`唤醒等待池中的一个线程,而`notifyAll()`唤醒所有线程。这三个方法都需要在`Object`类型的对象上调用,因为它们是`Object`类的方法。 `run()`和`start()`是创建和启动线程的核心方法。`run()`包含需要...

    操作系统实验 线程同步机制

    Release() 方法用于释放锁,只有拥有锁的线程才能释放锁,并唤醒等待该锁的线程。 二、条件变量 条件变量是操作系统中另一个基本的同步机制。条件变量的主要作用是允许多个线程等待某个条件的出现,并在该条件出现...

    Java的多线程-线程间的通信.doc

    如果睡眠过程中被中断(通过`interrupt()`方法),线程会抛出`InterruptedException`。 4. **join()**: - `join()`方法允许当前线程等待指定线程结束。调用`thread.join()`会使当前线程等待thread线程执行完毕后...

    Java 线程常用方法总结

    在Java中,线程的创建和管理涉及几个关键方法以及一个关键字:`run()`, `start()`, `wait()`, `notify()`, `notifyAll()`, `sleep()`, `yield()`, `join()` 和 `synchronized`。以下是对这些方法和关键字的详细说明...

    Java工程师线程试题

    1. **线程睡眠**:`Thread.sleep()`方法用于使当前线程进入睡眠状态,参数单位为毫秒。例如,`sleep(10000)`表示线程将休眠10秒。 2. **线程创建方式**:Java提供两种创建线程的方式:继承`Thread`类或者实现`...

    java中的线程使用.pdf

    start方法会调用run方法,但它们之间的主要区别在于:start是由虚拟机调用,而run则可以被程序员随时调用,这并不符合线程启动的原则。 Runnable接口是另一种实现线程的方式。通过实现Runnable接口,定义一个run...

    线程及多线程的详细讲解

    如果线程处于睡眠状态,则可以唤醒线程。 - `isInterrupted()`:判断当前线程是否被中断。 - `isAlive()`:判断线程是否处于运行状态。 - `destroy()`:终止一个线程,但不清理相关资源。 - `sleep(long millis)`:...

    java常用的代码——线程

    `wait()`使当前线程等待,直到被其他线程唤醒;`notify()`随机唤醒一个等待的线程;`notifyAll()`唤醒所有等待的线程。 ### 总结 Java中的线程管理是一项复杂但重要的任务。通过合理地使用线程,可以极大地提高程序...

    java线程学习笔记

    3. Wait() 方法:使线程进入等待状态,释放锁资源,notify() 或 notifyAll() 唤醒线程,这三个方法必须在获得对象锁的状态下使用,否则报错。 4. IO 阻塞:线程因等待 IO 操作的完成而被阻塞。 线程优先级: 线程...

    线程笔记(多线程,异常)

    当信号为`false`(或未被设置)时,调用`WaitOne()`的线程会被阻塞,直到其他线程调用`Set()`方法将信号设置为`true`,然后至少一个等待的线程会被唤醒。 5. **Mutex类**:`Mutex`类提供了线程间的互斥访问,确保...

    java线程入门

    - **wait(), notify(), notifyAll()**:这三个方法用于线程间的通信,wait()使当前线程等待,notify()唤醒一个等待的线程,notifyAll()唤醒所有等待的线程。 - **死锁**:多个线程互相等待对方释放资源导致无法...

    pintos 线程休眠实现

    5. **事件触发唤醒**:当等待的事件发生(例如,信号量被释放),系统会查找相关睡眠队列,并将其中的所有线程唤醒,将它们重新放入就绪队列,等待下一次调度。 6. **恢复上下文**:被唤醒的线程在重新被调度时,会...

    sleep() 方法和wait()方法的区别.docx

    wait() 方法可以通过 notify 或者 notifyAll 或者指定睡眠时间来唤醒当前等待池中的线程。 sleep() 和 wait() 方法的区别 sleep() 和 wait() 方法的最大区别是: 1. sleep() 睡眠时,保持对象锁,仍然占有该锁; ...

Global site tag (gtag.js) - Google Analytics