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