Java多线程之yield,join,wait,sleep的区别

Java多线程中,经常会遇到yield,join,wait和sleep方法。容易混淆他们的功能及作用。自己仔细研究了下,他们主要的区别是在cpu的占用和共享资源的锁上面。

wait:是继承自Object的方法,当前线程调用wait方法,是在告诉别的线程,我需要等待了,既会释放cpu,也会释放共享资源的锁,进入挂起状态。wait必须在synchronized代码块内部执行,因为wait需要获得共享资源的锁并且释放锁。需要notify/notifyAll来唤醒。wait主要和sleep进行区别,

join:Thread的非静态方法。底层用了wait方法。假如现在有两个线程,main线程和t线程.main线程里调用t.join.那么这时,main会取得线程对象t的锁,然后main线程 wait,释放cpu,t线程执行,

直到t线程执行完后,main线程继续执行。

jdk中join的源代码:

  1. /**
  2. * Waits at most {@code millis} milliseconds for this thread to
  3. * die. A timeout of {@code 0} means to wait forever.
  4. *
  5. * <p> This implementation uses a loop of {@code this.wait} calls
  6. * conditioned on {@code this.isAlive}. As a thread terminates the
  7. * {@code this.notifyAll} method is invoked. It is recommended that
  8. * applications not use {@code wait}, {@code notify}, or
  9. * {@code notifyAll} on {@code Thread} instances.
  10. *
  11. * @param millis
  12. * the time to wait in milliseconds
  13. *
  14. * @throws IllegalArgumentException
  15. * if the value of {@code millis} is negative
  16. *
  17. * @throws InterruptedException
  18. * if any thread has interrupted the current thread. The
  19. * <i>interrupted status</i> of the current thread is
  20. * cleared when this exception is thrown.
  21. */
  22. public final synchronized void join(long millis)
  23. throws InterruptedException {
  24. long base = System.currentTimeMillis();
  25. long now = 0;
  26. if (millis < 0) {
  27. throw new IllegalArgumentException("timeout value is negative");
  28. }
  29. if (millis == 0) {
  30. while (isAlive()) {
  31. wait(0);
  32. }
  33. } else {
  34. while (isAlive()) {
  35. long delay = millis - now;
  36. if (delay <= 0) {
  37. break;
  38. }
  39. wait(delay);
  40. now = System.currentTimeMillis() - base;
  41. }
  42. }
  43. }
  44. /**
  45. * Tests if this thread is alive. A thread is alive if it has
  46. * been started and has not yet died.
  47. *
  48. * @return <code>true</code> if this thread is alive;
  49. * <code>false</code> otherwise.
  50. */
  51. public final native boolean isAlive();

通过源代码,可以看出,如果t线程生成了,但是还未start,那么join方法是没有效果的。

sleep:是Thread的静态方法,会使当前线程释放cpu,但不会释放锁资源,可以理解为只和cpu有关,不涉及锁资源。涉及锁资源的,是wait,join方法。

yield:也是Thread的静态方法,和sleep方法类似,会使当前线程释放cpu,但不会释放锁资源。和sleep不同的是,sleep必须设置时间,但是yield不能设置时间,时间值是随机的

java多线程之yield,join,wait,sleep的区别的更多相关文章

  1. java 多线程之:join() 方法

    join()介绍 join() 定义在java.lang.Thread中. join() 的作用:让"主线程"等待"子线程"结束之后才能继续运行.

  2. java多线程之yield()方法详解

         yiled()方法的作用是放弃当前CPU的资源,将资源让给其它线程,但放弃的时间不确定,有可能刚刚放弃,又马上获得了CPU时间片.下面看一个小例子,看一下具体效果. public stati ...

  3. Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术

      package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...

  4. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  5. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  6. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  7. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  8. JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

    JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...

  9. java多线程之wait和notify协作,生产者和消费者

    这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...

随机推荐

  1. react native出现 undefined is not a function_this4.错误函数无法识别

    该函数可能里可能有this,的上个函数this要绑定bind(this)

  2. Java中 == 和 equals 的问题

    == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) equals() : 它的作用也是判断两个对象是否 ...

  3. ANNOTATION 注解

    注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是 ...

  4. app 开发

    移动APP开发   ios  Android 中国人写的 MUI 布局框架 HTML5plus 硬件驱动调用(打开摄像头,闪光灯,震动) 和 系统调用(打开相册,通讯录,message) http:/ ...

  5. 在CI (Jenkins) 从机(服务器)上使用bat批处理执行自动构建任务时,输出NuGet还原失败的解决方案

    编译环境:Jenkins+MSBuilds 1.搜索本次构建的解决方案中的所有csproj后缀文件,打开后找到这一段代码,并且删除掉.如果没有,直接忽略跳过. <Import Project=& ...

  6. java学习路线之必会的java基础教程

    大数据产业已进入发展的“快车道”,急需大量优秀的大数据人才作为后盾.如果你是Java编程出身,那学习大数据自然是锦上添花:但如果你是刚刚接触大数据技术,还在Java编程基础阶段,这篇文章非常值得你看! ...

  7. 爬虫----selenium模块

    一.介绍 selenium最初是一个测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳 ...

  8. GoldenGate12.3中新增的Parallel Replicat (PR)介绍

    Parallel Replicat介绍 在OGG 12.3.0.1中新增的一项特性parallel replicat(并行投递),相对于传统的投递和集成投递(integrated replicat), ...

  9. 忘记mysql密码时对密码进行更改

    第一步:   打开cmd   输入:net stop mysql 第二步:   再打开另一个cmd    输入:mysqld --skip-grant-tables 第三步:   打开第三个cmd  ...

  10. 基于PI+QT实现OpenCV图像处理操作(基本环境搭建)

    这篇博客就是在PI上直接写出来的!cheers!! PI3的性能已经非常强劲,而作为一个能够独立运行的运算单元,使用它来做图像处理,将是非常适合的.为了挖掘机器的最大潜能,我没有采用比较常见的pyth ...