join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了2种语言中多线程.join的用法。
JAVA版本:
package com.cn.net; public class test { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub //线程A final Thread ThreadA = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("A : " ); if (i == 9) { break; } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); Thread ThreadB = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("B : "); if (i == 4) { break; } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // try { // ThreadA.join();//在这里插入线程A // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } for (int i = 0; i < 5; i++) { System.out.println("C : " ); if (i == 4) { break; } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); ThreadA.start(); ThreadB.start(); }
}
C#版本:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Mutiprocess { class Program { static void Main(string[] args) { //线程A Thread ThreadA = new Thread(delegate() { for (int i = 0; i < 10; i++) { Console.WriteLine("A : "); if (i == 9) { break; } Thread.Sleep(1000); } }); //线程B Thread ThreadB = new Thread(delegate() { for (int i = 0; i < 5; i++) { Console.WriteLine("B : "); if (i == 4) { break; } Thread.Sleep(1000); } ThreadA.Join();//在这里插入线程A for (int i = 0; i < 5; i++) { Console.WriteLine("C : "); if (i == 4) { break; } Thread.Sleep(1000); } }); ThreadA.Start(); ThreadB.Start(); // 前5秒 A B交替出现,然后A出现5次,C出现5次。 //如果注释掉ThreadA.Join(),那么结果是前5秒AB 交替出现 后5秒AC交替出现。 //这里我就不再罗嗦了。还是那样线程B中join了线程A只有A执行结束,才可以继续执行线程B中剩下的代码。 //join其实就是使异步执行线程转为同步执行。 } } }
2中版本的执行(可能)结果是(cpu决定):
A :
B :
A :
B :
A :
B :
B :
A :
B :
A :
A :
A :
A :
A :
A :
C :
C :
C :
C :
C :
当把ThreadA.Join() 注释掉后的显示的规则结果是:
A :
B :
A :
B :
A :
B :
A :
B :
A :
B :
C :
A :
C :
A :
C :
A :
C :
A :
C :
A :
更多关于多线程的解释及例子相见
http://developer.51cto.com/art/200906/132331.htm
http://www.cnblogs.com/qinpengming/archive/2012/05/08/2490665.html