Java中join和yield的作用

来源:互联网 发布:焦大seo视频下载 编辑:程序博客网 时间:2024/06/08 07:02

     

                                本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

      

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

用一个小例子来说明吧

static class ThreadA extends Thread {@Overridepublic void run() {// TODO Auto-generated method stubsuper.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 stubthis.a = a;}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();System.out.println("ThreadB start");try {a.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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 {@Overridepublic void run() {// TODO Auto-generated method stubsuper.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 stubthis.a = a;}@Overridepublic void run() {// TODO Auto-generated method stubsuper.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 blocke.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执行。



1 0
原创粉丝点击