C#多线程Thread.Join()的详解

class TestThread
    {
        private static void FirstThreadFun()
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(Thread.CurrentThread.Name + "   i =  " + i);

            }
            Console.WriteLine(Thread.CurrentThread.Name + " 执行完毕");
        }
static void Main(string[] args)
        {
            //程序调用了Main()函数时,就起动了一个进程,同时也启动了一个线程[这个线程就是主线程].
            Thread.CurrentThread.Name = "MainThread";

            //创建第一个线程
            Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
            //取名为 firstThread
            firstThread.Name = "firstThread";

            for (int z = 0; z < 20; z++)
            {
                if (z == 10)
                {
                    firstThread.Start();
                    firstThread.Join();
                }
                else
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "   z =  " + z);
                }
            }
            Console.Read();
        }
    }
}

运行结果:

总结:

1.任何程序在执行时,至少有一个主线程。

2.firstThread.Start()启动了一个线程后,用firstThread.Join()这个方法加入一个线程[即:暂停了主线程的运行],那么操作系统就会马上执行这个新加入的线程

3.Join 就是加入的意思,也就是说新创建的线程加入到进程中,并马上执行

4.如果只是 firstThread.Start(),把 firstThread.Join()方法注释掉会是什么结果?

下面的图是运行结果:

从运行结果可以看出:

1.如果只是 firstThread.Start(),注释掉 firstThread.Join()这个方法后,主线程并不会暂停[也就是说,firstThread 线程并不会马上执行]

2.所以要想一个线程在启动后就马上执行,必须调用 Thread.Join()方法.

3.到这里,Thread.Join()这个方法的作用也就明显了:当调用了 Thread.Join()方法后,当前线程会立即被执行,其他所有的线程会被暂停执行.

当这个线程执行完后,其他线程才会继续执行.

我们通过其中提供的Thread类来创建和控制线程,ThreadPool类用于管理线程池等。
(此外还提供解决了线程执行安排,死锁,线程间通讯等实际问题的机制。)

Thread类有几个至关重要的方法,描述如下:
Start():启动线程;
Sleep(int):静态方法,暂停当前线程指定的毫秒数; 
Abort():通常使用该方法来终止一个线程;
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复; 
Resume():恢复被Suspend()方法挂起的线程的执行;

时间: 2024-11-07 05:26:54

C#多线程Thread.Join()的详解的相关文章

JAVA多线程Thread VS Runnable详解

要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件 进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销. 线程是进程中的一个实体,是被系统独立调度和分派的基本单位.线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源.所以线程是轻量级的

Java多线程中join方法详解

join()方法用于让当前执行线程等待join线程执行结束.其实现原理是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待. join()方法部分实现细节 while(isAlive()) { wait(0) } 其中wait(0)表示永远等待下去. join线程中止后,线程的this.notifyAll()方法会被调用,调用notifyAll()是在JVM里调用的所有在JDK中看不到,大家可以看JVM源码 示例程序: public calss ThreadTest{ pu

Java线程join示例详解

Java线程的join方法可用于暂停当前线程的执行直至目标线程死亡.Thread中一共有三个join的重载方法. public final void join():该方法将当前线程放入等待队列中,直至被它调用的线程死亡为止.如果该线程被中断,则会抛出InterruptedException异常. public final synchronized void join(long millis):该方法用于让当前线程进入等待状态,直至被它调用的线程死亡或是经过millis毫秒.由于线程的执行依赖于操

SQL中的JOIN语法详解

参考以下两篇博客: 第一个是 sql语法:inner join on, left join on, right join on详细使用方法 讲了 inner join, left join, right join的意义和用法. 第二个是 SQL中的left outer join,inner join,right outer join用法详解 讲了关系运算背后的数学原理,以及提到了更多类型的连接操作: inner join- 笛卡尔乘积再选取, left outer join, right out

T-SQL之JOIN关键字详解

这几天由于工作的需要,写了一个业务逻辑较复杂的存储过程,其中多次用到了JOIN.LEFT JOIN.RIGHT JOIN在处理表之间的逻辑的作用被渲染的淋漓尽致.说明一下,之前少处理数据库后台的经验,特别是没有好好的研究SQL的知识细节.不过也简单的学习了,自以为看明白了.就懂了.现在想来那时就是浅尝辄止.用了之后,对它的理解更深了.现在及时总结下.以备忘和日后查看.下面示例的demo代码是来自W3School.接下来直入主题. JOIN 1 SELECT Persons.LastName, P

多线程之 Final变量 详解

原文: http://www.tuicool.com/articles/2Yjmqy 总结: Final 变量在并发当中,原理是通过禁止cpu的指令集重排序(重排序详解http://ifeve.com/java-memory-model-1/ http://ifeve.com/java-memory-model-2/),来提供现成的课件性,来保证对象的安全发布,防止对象引用被其他线程在对象被完全构造完成前拿到并使用. 与Volatile 有相似作用,不过Final主要用于不可变变量(基本数据类型

java.lang.Thread.State类详解

public static enum Thread.Stateextends Enum<Thread.State>线程状态.线程可以处于下列状态之一: 1.NEW 至今尚未启动的线程的状态. 2.RUNNABLE 可运行线程的线程状态.处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器. 3.BLOCKED 受阻塞并且正在等待监视器锁的某一线程的线程状态.处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Obj

多线程的常见用法详解 --转载

1.多线程:使用多个处理句柄同时对多个任务进行控制处理的一种技术.据博主的理解,多线程就是该应用的主线程任命其他多个线程去协助它完成需要的功能,并且主线程和协助线程是完全独立进行的.不知道这样说好不好理解,后面慢慢在使用中会有更加详细的讲解. 2.多线程的使用: (1)最简单.最原始的使用方法:Thread oGetArgThread = new Thread(new ThreadStart(() =>{});这种用法应该大多数人都使用过,参数为一个ThreadStart类型的委托.将Threa

C#基础系列——多线程的常见用法详解

前言:前面几节分别介绍了下C#基础技术中的反射.特性.泛型.序列化.扩展方法.Linq to Xml等,这篇跟着来介绍下C#的另一基础技术的使用.最近项目有点紧张,所以准备也不是特别充分.此篇就主要从博主使用过的几种多线程的用法从应用层面大概介绍下.文中观点都是博主个人的理解,如果有不对的地方望大家指正~~ 1.多线程:使用多个处理句柄同时对多个任务进行控制处理的一种技术.据博主的理解,多线程就是该应用的主线程任命其他多个线程去协助它完成需要的功能,并且主线程和协助线程是完全独立进行的.不知道这