`
dsxwjhf
  • 浏览: 73008 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

【转】 Java 中 join 和 yield 的作用

阅读更多
原文地址: Java 中 join 和 yield 的作用

1、 A.join,在API中的解释是,堵塞当前线程B,直到A执行完毕并死掉,再执行B。

用一个小例子来说明吧
  static class ThreadA extends Thread {
    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      for (int i = 0; i < 10; i++) {
        System.out.println("ThreadA" + i);
      }
    }
  }

  static class ThreadB extends Thread {
    ThreadA a;

    public ThreadB(ThreadA a) {
      // TODO Auto-generated constructor stub
      this.a = a;
    }

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      System.out.println("ThreadB start");
      try {
        a.join();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      System.out.println("ThreadB end");
    }
  }

  public static void main(String[] args) {
    ThreadA a = new ThreadA();
    ThreadB b = new ThreadB(a);
    b.start();
    a.start();
  }

执行结果:
ThreadB start
ThreadA0
ThreadA1
ThreadA2
ThreadA3
ThreadA4
ThreadA5
ThreadA6
ThreadA7
ThreadA8
ThreadA9
ThreadB end

首先b线程执行,a线程join后,直接执行完a,然后才执行b,证实上述说法。

2、 A.yield,A让出位置,给B执行,B执行结束A再执行。跟join意思正好相反!

  static class ThreadA extends Thread {
    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      for (int i = 0; i < 10; i++) {
        System.out.println("ThreadA " + i);
      }
    }
  }

  static class ThreadB extends Thread {
    ThreadA a;

    public ThreadB(ThreadA a) {
      // TODO Auto-generated constructor stub
      this.a = a;
    }

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      System.out.println("ThreadB start");
      try {
        for (int i = 0; i < 10; i++) {
          if(i==2){
            a.yield();
          }
          System.out.println("ThreadB " + i);
        }
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      System.out.println("ThreadB end");
    }
  }

  public static void main(String[] args) {
    ThreadA a = new ThreadA();
    ThreadB b = new ThreadB(a);
    b.start();
    a.start();
  }

执行结果:
ThreadB start
ThreadA 0
ThreadB 0
ThreadA 1
ThreadB 1
ThreadA 2
ThreadB 2
ThreadB 3
ThreadB 4
ThreadB 5
ThreadB 6
ThreadB 7
ThreadB 8
ThreadB 9
ThreadB end
ThreadA 3
ThreadA 4
ThreadA 5
ThreadA 6
ThreadA 7
ThreadA 8
ThreadA 9

首先B执行,然后A执行;在B的循环中,i=2时,A执行yield;接着B执行完,才轮到A执行。
分享到:
评论

相关推荐

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

    以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...

    Java线程中yield与join方法的区别Java开发J

    在Java多线程编程中,理解并正确使用`yield`和`join`方法是至关重要的。这两个方法都属于线程控制策略的一部分,但它们的作用和使用场景有所不同。 首先,我们来详细探讨`Thread.yield()`方法。这个方法的目的是让...

    Java线程中yield与join方法的区别

    之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。  Java线程调度...

    T03-Sleep-Yield-Join.java

    T03_Sleep_Yield_Join.java

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

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

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

    本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...

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

    今天我们将深入探讨由IT十八掌徐培成讲解的Java基础课程中的第八天主题——多线程,特别是关于`yield()`方法的知识点。 首先,我们要明白什么是线程。线程是程序执行的最小单位,每个线程都代表程序的一个独立控制...

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    在Java中,可以使用Thread类的yield()方法实现线程的礼让。 线程的合并是指一个线程等待另一个线程执行完毕后再继续执行。在Java中,可以使用Thread类的join()方法实现线程的合并。 线程的中断是指在一个线程中断另...

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java面试题.pdf

    2. sleep()、wait()、join()、yield() 之间的区别:sleep() 方法使线程休眠,wait() 方法使线程等待,join() 方法使线程等待其他线程完成,yield() 方法使线程让步。 3. Thread 和 Runnable 的区别:Thread 是线程类...

    完整版精品java课件 Java基础入门教程 Java程序设计 第13章 多线程(共24页).ppt

    在Java中,多线程允许程序中有多个执行流同时进行,从而提高程序的效率和响应速度。 首先,我们需要理解线程的基本概念。线程是进程中的一个执行单元,每个进程可以包含一个或多个线程。在Java中,多线程的实现可以...

    javajava问问题题点

    sleep、wait 和 join 是 Java 中的线程控制方法。sleep 方法可以让线程暂停执行,wait 方法可以让线程等待对象锁,join 方法可以让线程等待目标线程执行完成。 yield yield 方法可以让线程礼让,释放 CPU 资源给...

    Java线程学习和总结

    Java提供了一些方法来控制线程状态,如`sleep()`使线程暂停执行一段时间,`join()`等待指定线程结束,`yield()`让当前线程暂停,让其他相同优先级的线程有机会执行,`interrupt()`用于中断线程。 同步是Java线程...

    Java Thread Programming

    Java提供了多种线程控制方法,如start()用于启动线程,run()是线程的主要执行体,join()使当前线程等待该线程终止,sleep()使线程暂停执行一段时间,yield()让当前线程暂停,让其他线程有机会运行,synchronized...

    13-Java并发编程学习宝典.zip

    Java并发编程是软件开发中的重要领域,特别是在大型系统和高并发场景中不可或缺。"13-Java并发编程学习宝典.zip" 包含了一系列关于Java并发编程的学习资源,旨在帮助开发者掌握多线程编程的核心技术和最佳实践。以下...

    java_Java_学习笔记.zip

    - 线程控制:start()、sleep()、join()、yield()、interrupt()等方法。 - 同步机制:synchronized关键字和Lock接口。 这份80页的学习笔记详细讲解了这些核心概念,并使用了彩色标记突出重点内容,对于新手复习和...

    JAVA多线程(精典总结)

    Java虚拟机提供了`Thread.sleep()`,`Thread.yield()`和`Thread.join()`等方法来影响线程调度。`sleep()`使当前线程进入阻塞状态,定时后自动恢复到就绪状态;`yield()`让当前线程短暂放弃CPU,但不保证一定让其他...

    Java多线程技术精讲

    Java中控制线程的方法有多种,如start()启动线程,run()执行线程,sleep()让线程休眠,join()等待其他线程完成,yield()让当前线程暂停,让其他线程有机会执行,以及interrupt()和isInterrupted()用于中断和检查线程...

    Java线程.ppt

    `sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断线程,以及`wait()`和`...

Global site tag (gtag.js) - Google Analytics