`

java并发之yield(),sleep(),wait()区别详解

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

2、join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。

3、yield()
该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

4、wait()和notify()、notifyAll()

这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
注意 这三个方法都是java.lang.Object的方法。


二、run和start()
把需要处理的代码放到run()方法中,start()方法启动线程将自动调用run()方法,这个由java的内存机制规定的。并且run()方法必需是public访问权限,返回值类型为void。

三、关键字synchronized
该关键字用于保护共享数据,当然前提条件是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问到该对象,被Synchronized修饰的数据将被"上锁",阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。


四、wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法。
(1)、常用的wait方法有wait()和wait(long timeout);
void wait() 在其他线程调用此对象的 notify() 方法或者 notifyAll()方法前,导致当前线程等待。
void wait(long timeout)在其他线程调用此对象的notify() 方法 或者 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其他shnchronized数据可被别的线程使用。

wait()h和notify()因为会对对象的“锁标志”进行操作,所以他们必需在Synchronized函数或者 synchronized block 中进行调用。如果在non-synchronized 函数或 non-synchronized block 中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。。

(2)、Thread.sleep(long millis)必须带有一个时间参数。
sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;
sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;
sleep(long)是不会释放锁标志的。

(3)、yield()没有参数
sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。
yield()也不会释放锁标志。
实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。

yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会。
分享到:
评论

相关推荐

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    《Java高并发编程详解:多线程与架构设计》是一本深入探讨Java中多线程编程和并发架构的书籍,适合Java开发者和架构师阅读。本书分为四个部分,旨在帮助读者掌握Java并发的核心技术和设计原则。 第一部分是多线程...

    Java并发编程面试题(2022最新版)

    ### Java并发编程面试题知识点详解 #### 一、基础知识 **并发编程的优缺点** - **优点:** - **提高资源利用率:** 并发可以让多个任务共享资源,提高CPU和其他硬件资源的利用率。 - **提升系统响应速度:** 多...

    详解Java中的线程让步yield()与线程休眠sleep()方法

    本文将详细解析Java中的线程让步方法`yield()`以及线程休眠方法`sleep()`,并与线程等待的`wait()`方法进行对比。 首先,线程让步`yield()`方法的主要作用是让当前线程主动放弃执行权,让其他处于就绪状态且具有...

    Java并发编程面试题(2024最新版)-重点.docx

    ### Java并发编程面试题知识点详解 #### 一、基础知识与概念 **1. 并发编程的优缺点:** - **优点:** - **提高性能:**通过多个任务同时执行,可以有效利用多核处理器资源,提升整体系统的吞吐量。 - **响应性:...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    Java多线程编程详解

    ### Java多线程编程详解 #### 一、线程同步机制 在Java多线程编程中,线程同步是一项至关重要的技术,它主要用于解决多线程环境中的资源共享问题。由于同一进程中的多个线程共享同一片内存空间,这就意味着它们...

    JAVA多线程编程详解-详细操作例子

    本主题将深入探讨“JAVA多线程编程详解-详细操作例子”,结合提供的资源,我们可以从以下几个方面进行学习: 1. **线程的基本概念**: 线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过实现...

    java+多线程+同步详解源代码学习

    Java多线程与同步是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程...

    java 多线程详解

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提升系统效率。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。这篇博文详细介绍了这两种方法以及它们之间的差异。 1....

    Java多线程编程深入详解.rar

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。下面我们将深入探讨Java多线程编程的...

    Java软件开发实战 Java基础与案例开发详解 12-2 线程的生命周期 共10页.pdf

    在Java软件开发过程中,线程是实现并发的重要手段之一。了解线程的生命周期对于有效地管理和控制线程至关重要。线程从创建到销毁的过程可以分为多个状态,每个状态都有其特定的意义。 #### 线程的状态及其转换 ...

    Java多线程超级详解(看这篇就足够了).pdf

    Java提供了多种控制线程状态的方法,如`start()`启动线程,`run()`定义线程要执行的任务,`yield()`放弃当前CPU时间片,`join()`使线程等待其他线程完成,`sleep(long milliseconds)`让线程休眠指定时间,`wait()`让...

    java-concurrency-in-practice:java并发精讲

    在Java编程中,处理并发问题是提升应用程序性能和响应速度的关键,也是开发者必须掌握的核心技能之一。 一、实现多线程的两种方式 在Java中,有以下两种方式来创建和管理线程: 1. 继承Thread类:自定义一个类继承...

    java线程与模式总结

    Java中的线程机制是其一大亮点之一,它直接支持线程级别的并发处理。线程相比于进程具有创建成本低、上下文切换快等优势,这使得Java在处理高并发场景时能够表现出色。然而,线程的使用对开发者提出了较高的要求,...

    java线程详解

    ### Java线程详解 #### 一、扩展`java.lang.Thread`类 在Java中实现多线程的一个方式是通过继承`java.lang.Thread`类。这种方式简单直观,但也有一定的局限性,比如不能再次继承其他类。 **示例代码**: ```java...

    2020老杜最新Java零基础进阶视频教程-多线程课件

    Java提供了多种线程控制方法,如`sleep()`, `join()`, `yield()`, `interrupt()`, 和 `isInterrupted()`等,用于控制线程的执行顺序和暂停。 6. 线程同步 为了防止多个线程同时访问共享资源导致数据不一致,Java...

    Python使用asyncio包处理并发详解

    `asyncio`是Python的标准库之一,专门用于处理异步I/O和并发操作,尤其适用于网络编程和事件驱动的应用。 `asyncio`的核心概念是事件循环(Event Loop)和协程(Coroutine)。事件循环是整个异步模型的驱动力,它...

    JAVA-multithreaded-programming.rar_Java @multithreaded_java prog

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率...通过阅读提供的"JAVA多线程编程详解-详细操作例子.doc"文档,你可以深入了解这些概念并学习如何在实际项目中应用。

Global site tag (gtag.js) - Google Analytics