`

探秘System.Threading系列 第二篇:还是Thread,Thread.Start 和 Thread.Join

阅读更多

1. 开始一个Thread
开始一个Thread很简单,声明一个Thread实例,然后调用Start方法即可


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Thread threadA = new Thread(new ThreadStart(WorkMethod));
threadA.Start();

Thread threadB 
= new Thread(new ParameterizedThreadStart(WorkMethodWithParam));
threadB.Start(obj);


2. Thread.Join阻塞调用线程,直到某个线程终止为止。
我按照msdn上的解释的理解是:
threadA.Join()方法是用来阻塞threadA线程,直到在threadA开始执行之后启动的线程执行完毕(或者Sleep了)之后,才开始执行threadA线程的方法

但是事实并非如我所想,下面是msdn上的例子,先声明了一个thread实例,然后将一个方法放入ThreadPool中执行,并调用thread的Join方法以阻塞thread的执行。显示结果在预料之中


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Threading;

class IsThreadPool
{
    
static void Main()
    {
        AutoResetEvent autoEvent 
= new AutoResetEvent(false);

        Thread regularThread 
= 
            
new Thread(new ThreadStart(ThreadMethod));
        regularThread.Start();
        ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), 
            autoEvent);

        
// Wait for foreground thread to end.
        regularThread.Join();

        
// Wait for background thread to end.
        autoEvent.WaitOne();
    }

    
static void ThreadMethod()
    {
        Console.WriteLine(
"ThreadOne, executing ThreadMethod, " +
            
"is {0}from the thread pool."
            Thread.CurrentThread.IsThreadPoolThread 
? "" : "not ");
    }

    
static void WorkMethod(object stateInfo)
    {
        Console.WriteLine(
"ThreadTwo, executing WorkMethod, " +
            
"is {0}from the thread pool."
            Thread.CurrentThread.IsThreadPoolThread 
? "" : "not ");

        
// Signal that this thread is finished.
        ((AutoResetEvent)stateInfo).Set();
    }
}

执行结果是:ThreadTwo, executing WorkMethod, is from the thread pool.
ThreadOne, executing ThreadMethod, 
is not from the thread pool.

 

但是当我对这个例子稍作修改之后就出现了不可理解的问题,我在WorkMethod中加上Thread.Sleep让线程池中的线程休眠2秒,这样操作之后执行结果是:

执行结果
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ThreadTwo, executing WorkMethod, is from the thread pool.
Sleep
ThreadOne, executing ThreadMethod, 
is not from the thread pool.
Sleep end

可以看出当线程池中的线程Sleep之后,被Join的thread即获得执行权,开始执行,这个似乎和msdn的解释有出入

另外我还做了一个测试,把另一个线程用Thread启动,而不是放在线程池中执行,看是否可以正常的阻塞线程,但是结果却是出人意料的,不能按预期阻塞,请看下面的实例代码:


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    class IsThreadPool
    {
        
static void Main()
        {
            AutoResetEvent autoEvent 
= new AutoResetEvent(false);

            Thread threadA 
=
                
new Thread(new ThreadStart(ThreadMethod));

            Thread threadB 
= new Thread(new ParameterizedThreadStart(WorkMethod));

            threadA.Start();

            
// Wait for foreground thread to end.
            threadA.Join();
            threadB.Start(autoEvent);



            
// Wait for background thread to end.
            autoEvent.WaitOne();


            Console.Read();
        }

        
static void ThreadMethod()
        {
            Console.WriteLine(
"ThreadOne, executing ThreadMethod, " +
                
"is {0}from the thread pool.",
                Thread.CurrentThread.IsThreadPoolThread 
? "" : "not ");
        }

        
static void WorkMethod(object stateInfo)
        {
            Console.WriteLine(
"ThreadTwo, executing WorkMethod, " +
                
"is {0}from the thread pool.",
                Thread.CurrentThread.IsThreadPoolThread 
? "" : "not ");
            
// Signal that this thread is finished.
            ((AutoResetEvent)stateInfo).Set();
        }
    }

不知道什么原因,上面的代码中threadA并没有被阻塞,难道是只能阻塞放在ThreadPool中执行的线程?没有道理,我反复做了实验都没有成功,把这个结果贴出来,请大家释疑。

0
0
分享到:
评论

相关推荐

    .Net 3.5 使用 System.Threading.Task

    .Net 3.5 下使用的 System.Threading.Tasks。...安装完成后,添加引用时只需要在安装目录 C:\Program Files (x86)\Microsoft Reactive Extensions\Redist\DesktopV2 下找到 System.Threading.dll,添加即可

    .NET Framework 3.5上使用System.Threading.Tasks

    我在做一个兼容WindowsXP项目时用到,用梯子到外面找来的。 由于 .NET 3.5下并没有官方实现的 Task 库,所以,是通过 VS 中 NuGet 取得的 非官方 实现的 Task 库,调用接口与官方.NET 4.0 后的应该是差不多的。

    system.Threading.Timer的使用

    在.NET框架中,`System.Threading.Timer`类是一个用于在后台线程上执行周期性操作的强大工具。这个类属于多线程编程的一部分,特别是在处理异步任务和定时触发事件时非常有用。下面我们将深入探讨`System.Threading....

    System.Threading.zip

    .Net 3.5支持Plinq的相关信息已被微软撤掉了, 而引用此dll可以使3.5的Linq支持AsParallel()方法, 3.5可以使用1.0.3058.34407版本。...using System.Threading.Tasks; using System.Threading; using System.Linq;

    C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...

    Thread类位于System.Threading命名空间下,System.Threading命名空间提供一些可以进行多线程

    在C#编程中,`System.Threading`命名空间是多线程编程的核心,它提供了大量类和接口用于创建、管理和同步线程。`Thread`类是这个命名空间中的关键类,它代表了一个执行线程,允许程序员直接控制线程的生命周期。在`...

    C#常用的42个类

    2. **System.Collections.Generic.List**: 这是一个动态数组,可以存储特定类型的对象。提供了添加、删除、查找和排序等功能。 3. **System.IO.Stream**: 表示数据流,是所有输入/输出流的基础。例如,FileStream...

    C#利用System.Threading.Thread.Sleep即时输出信息的详解

    在C#编程中,`System.Threading.Thread.Sleep`是一个非常有用的函数,它允许当前线程暂停执行指定的时间量,以便让其他线程有机会运行。在本文中,我们将深入探讨如何利用`Thread.Sleep`来实现即时输出信息,特别是...

    dxperience9.1官方汉化

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-...

    System.Diagnostics.Process的简单包装器,将其公开为System.Threading.Tasks.zip

    标题中的"System.Diagnostics.Process的简单包装器,将其公开为System.Threading.Tasks"暗示了一个关于.NET框架中的两个关键组件的讨论:`System.Diagnostics.Process`类和`System.Threading.Tasks`命名空间。...

    C sharp 中常用的42个类

    2. **System.String**:表示不可变的字符序列,提供了丰富的字符串操作方法,如`Substring()`、`Trim()`和`IndexOf()`。 3. **System.Int32**、**System.Double**、**System.Decimal**:整型、双精度浮点型和十进制...

    C# WPf经典教程包含有14个文件

    • System.Windows.Threading.DispatcherObject类:WPF 中的大多数对象是从 DispatcherObject 派生的,这提供了用于处理并发和线程的基本构造。WPF 基于调度程序实现的消息系统。 • System.Windows....

    WCF 双工 和 和 System.Threading.Timer 时间 的 demo

    标题中的“WCF 双工 和 System.Threading.Timer”的示例主要涵盖了两个重要的IT知识点:Windows Communication Foundation(WCF)的双工通信模式以及System.Threading.Timer类的使用。 首先,让我们详细了解一下WCF...

    C#常用的42个类,学习借鉴必备

    2. **System.Collections.Generic.List**: 这是一个动态数组,提供了一种高效、灵活的方式来存储和操作对象集合。它的`Add`, `Remove`, `IndexOf`等方法非常实用。 3. **System.IO.Stream**: 代表数据流,用于读写...

Global site tag (gtag.js) - Google Analytics