线程方法:sleep( )、wait()、join( )、yield( )的区别

简介: 线程方法:sleep( )、wait()、join( )、yield( )的区别

1 Sleep V.S wait

sleep

线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其 他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。 sleep() 使当前线程进入阻塞状态,在指定时间内不会执行

wait

Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待 此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象 锁定池准备获得对象锁进入运行状态。

区别比较

1、这两个方法来自不同的类分别是 Thread 和 Object

2、最主要是 sleep 方法没有释放锁,而 wait 方法释放了锁,使得其他线程可以使用同 步控制块或者方法。

3、wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可 以在任何地方使用(使用范围)

4、sleep 必须捕获异常,而 wait,notify 和 notifyAll 不需要捕获异常


(1) sleep 方法属于 Thread 类中方法,表示让一个线程进入睡眠状态,等待一定的时 间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程 的运行也需要时间,一个线程对象调用了 sleep 方法之后,并不会释放他所持有的所有对象 锁,所以也就不会影响其他进程对象的运行。但在 sleep 的过程中过程中有可能被其他对象 调用它的 interrupt(),产生 InterruptedException 异常,如果你的程序不捕获这个异常,线程 就会异常终止,进入 TERMINATED 状态,如果你的程序捕获了这个异常,那么程序就会继 续执行 catch 语句块(可能还有 finally 语句块)以及以后的代码。


sleep()方法是静态方法,也就是说他只对当前对象有效,通过 t.sleep()让 t 对象进入 sleep,这样的做法是错误的,它只会是使当前线程被 sleep 而不是 t 线程

(2) wait 属于 Object 的成员方法,一旦一个对象调用了 wait 方法,必须要采用 notify() 和 notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了 wait() 后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了 wait()方法的对象。 wait()方法也同样会在 wait 的过程中有可能被其他对象调用 interrupt()方法而产生

2 yield join notify notifyAll

yield()

停止当前线程,让同等优先权的线程或更高优先级的线程有执行的机会。 如果没有的话,那么 yield()方法将不会起作用,并且由可执行状态后马上又被执行。

join

用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执 行结束后,再继续执行当前线程。如:t.join();//主要用于等待 t 线程运行结束,若无此句, main 则会执行完毕,导致结果不可预测

notify

只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程 等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程取决于操作系统对多线程管理的实现。

notifyAll

唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系 统的实现。

目录
相关文章
|
1月前
|
监控 测试技术 程序员
解决线程死循环问题的有效方法
作为开发者想必都清楚,多线程应用程序的开发为我们日常开发工作中提供了并发执行任务的能力,但线程死循环问题却是一个常见而令人头疼的挑战,因为线程死循环可能导致系统的不稳定性、资源浪费以及应用程序的异常运行,所以准确地定位和妥善处理线程死循环现象,并在编码阶段就避免潜在风险,成为开发人员必须面对的重要问题,线程死循环问题的解决不仅有助于提高系统的稳定性和可用性,还能优化资源利用和提升应用程序的性能,通过采取适当的预防和处理措施,开发人员能够避免线程陷入无尽的循环,并及时发现和解决潜在问题。那么本文就来分享一下关于如何处理线程死循环问题,以及如何在编码阶段规避潜在风险。
39 2
解决线程死循环问题的有效方法
|
1天前
|
Unix Linux 调度
linux线程与进程的区别及线程的优势
linux线程与进程的区别及线程的优势
|
1天前
|
Java
Java一分钟:线程协作:wait(), notify(), notifyAll()
【5月更文挑战第11天】本文介绍了Java多线程编程中的`wait()`, `notify()`, `notifyAll()`方法,它们用于线程间通信和同步。这些方法在`synchronized`代码块中使用,控制线程执行和资源访问。文章讨论了常见问题,如死锁、未捕获异常、同步使用错误及通知错误,并提供了生产者-消费者模型的示例代码,强调理解并正确使用这些方法对实现线程协作的重要性。
9 3
|
12天前
|
调度
线程和进程的区别?
线程和进程的区别?
|
15天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?
|
21天前
|
NoSQL
线程死循环的定位方法
线程死循环的定位方法
24 2
|
23天前
使用代理IP池实现多线程的方法
使用代理IP池实现多线程的方法
|
1月前
|
Java API 调度
【并发编程】Java线程常见方法的使用
【并发编程】Java线程常见方法的使用
|
3天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
13 1
|
3天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
9 0