zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    Eclipse生成部署描述符(web.xml)
    异步Servlet和异步过虑器
    安装 R 及 R 包
    Servlet封装类
    设计模式——装饰者模式
    Eclipse快速生成覆盖方法、Getter、Setter的方法
    查看CPU核数和内存
    Filter 过滤器
    Listener 监听器
    Tag file
  • 原文地址:https://www.cnblogs.com/mistor/p/2490673.html
Copyright © 2011-2022 走看看