C#,JAVA各版本之Thread.join()详解

      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

 

 

  

 

 

posted @ 2012-05-08 20:36  黎明&岁月  阅读(822)  评论(1编辑  收藏  举报