打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(转)Java中join和yield的作用
  原文:http://blog.csdn.net/reboot123/article/details/22589621
本文来自 http://blog.csdn.net/liuxian13183/  ,引用必须注明出处!
 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 startThreadA0ThreadA1ThreadA2ThreadA3ThreadA4ThreadA5ThreadA6ThreadA7ThreadA8ThreadA9ThreadB 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 startThreadA 0ThreadB 0ThreadA 1ThreadB 1ThreadA 2ThreadB 2ThreadB 3ThreadB 4ThreadB 5ThreadB 6ThreadB 7ThreadB 8ThreadB 9ThreadB endThreadA 3ThreadA 4ThreadA 5ThreadA 6ThreadA 7ThreadA 8ThreadA 9
首先B执行,然后A执行;在B的循环中,i=2时,A执行yield;接着B执行完,才轮到A执行。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JAVA多线程之线程间的通信方式
synchronized 的用法,你知道多少?
java第一次作业
next()与nextLine区别
采用MQTT协议实现Android消息推送
java 线程池示例(自己实现的参考别人的代码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服