`
beston
  • 浏览: 8080 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Java多线程-线程的调度sleep,yield,join, wait,notify,notifyAll

 
阅读更多

Java多线程-线程的调度(休眠)   sleep 让给其他线程 不释放锁

 

    使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。

    例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。

    总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

Java多线程-线程的调度(让步)   yield 让给同优先级线程  不释放锁

 

     sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。

yield()也不会释放锁标志

    实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

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

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

 
    线程的让步使用Thread.yield()方法,yield()为静态方法功能是暂停当前正在执行的线程对象,并执行其他线程

 

 

Java多线程-线程的调度(合并)  join 

    线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。

join为非静态方法,定义如下:
void join(): 等待该线程终止。 
void join(long millis): 等待该线程终止的时间最长为 millis 毫秒。 
void join(long millis, int nanos): 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

 

 

Java多线程-线程的调度(守护线程)

守护线程使用的情况较少,,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

setDaemon方法的详细说明:
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机退出。

 
Java Object的wait,notify和notifyAll方法

        调用wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。

        调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

        调用notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

sleep和wait的区别有
  1,这两个方法来自不同的类分别是Thread和Object
  2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用

   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

分享到:
评论

相关推荐

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    java多线程源码-source

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的...

    【IT十八掌徐培成】Java基础第08天-01.多线程-yield.zip

    但是,由于其效果依赖于操作系统,并且可能不会立即生效,所以在设计并发程序时,应谨慎使用,更多地关注线程同步和通信机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法以及`java.util....

    线程中sleep、join、yield、wait的区别

    在Java多线程编程中,线程控制是非常关键的一部分,涉及到如何协调多个线程的执行顺序和资源分配。本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` ...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

    北大Java--多线程

    - 同步是为了确保线程间正确地共享数据,避免数据竞争,Java提供了`synchronized`, `wait()`, `notify()`, `notifyAll()`等机制。 6. **守护线程 (Daemon)**: - 守护线程是支持其他非守护线程运行的后台线程,当...

    java编程 ---线程

    线程的基本控制包括:`sleep()`让线程暂停一段时间,`join()`使当前线程等待另一个线程结束,`yield()`让当前线程让出CPU使用权,以及`interrupt()`中断线程。 **4. 使用`synchronized`关键字** `synchronized`用于...

    java_Thread.rar_java 多线程_java多线程

    线程间的通信主要依靠wait()、notify()和notifyAll()方法,这些方法位于Object类中,它们需要在同步控制块或同步方法内使用,以避免死锁和活锁等问题。 在实际开发中,还需要考虑线程安全问题,例如避免脏读、幻读...

    深入浅出 Java 多线程.pdf_java_

    Java提供了多种线程控制机制,如sleep()方法让线程进入阻塞状态,yield()方法让当前线程暂停,让其他线程有机会运行,join()方法让一个线程等待另一个线程完成,以及synchronized关键字用于线程同步,防止数据竞争...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...

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

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

    Java面试题-线程多线程.pdf

    在Java编程中,线程多线程是核心概念之一,尤其在面试中经常被问到。下面我们将深入探讨这些知识点。 首先,我们来看Java中的线程创建方式: 1. **Thread 类的子类化**:通过继承 `Thread` 类并重写 `run()` 方法...

    7Java第七单元练习题-Java多线程机制[参考].pdf

    - 在多线程程序中,线程之间的通信是必不可少的,可以通过wait()、notify()和notifyAll()方法实现。 8. 线程的优先级: - 在Java中可以通过设置线程的优先级来指定线程调度的优先顺序,优先级用数字表示,范围从1...

    JAVA(坦克大战,多线程管理).rar

    - 线程间通信:`wait()`, `notify()`, `notifyAll()`用于对象同步,`synchronized`关键字用于锁定资源防止数据不一致。 2. **线程状态与生命周期** - 线程有五种状态:新建、可运行、运行、阻塞和终止。理解这些...

    我总结的Java多线程程序设计

    4. **线程同步与通信**:由于线程共享内存空间,可能导致数据竞争问题,因此需要使用同步机制,如`synchronized`关键字,`wait()`, `notify()`和`notifyAll()`等方法来确保线程安全。 二、在Java中实现多线程 1. *...

    Java多线程编程模板

    在Java编程中,多线程是程序设计中的一个重要概念,特别是在服务器端应用和高并发场景下,多线程能够充分利用CPU资源,提高程序的执行效率。本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java...

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

    在Java编程中,多线程是并发执行任务的关键技术,它可以提高程序的效率和响应性。本文将深入探讨Java中的多线程操作方法,包括线程控制的基本方法、中断和睡眠以及相关示例。 首先,了解线程的基本状态至关重要。...

    B09多线程-1ppt课件(全).ppt

    【多线程概念详解】 多线程是一种编程技术,它允许多...此外,还可以使用`wait()`、`notify()`和`notifyAll()`方法进行线程间的通信和协作。理解并熟练掌握这些概念和技术,是成为一名优秀的Java多线程程序员的基础。

Global site tag (gtag.js) - Google Analytics