Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。下面我们用一个例子来解释怎样用Thread类来创建一个简单的线程。

static void Main(string[] args)

{

    //region只是用来包裹代码用的,实际没有什么用

    #region Thread无参数举例

    Thread th = new Thread(ThreadChild);

    th.Start();

    Console.WriteLine("Main Thread Start!");

    #endregion

 

    Console.ReadKey();

}

static void ThreadChild()

{

    Console.WriteLine("Child Thread Start!");

}

输出结果:

程序运行的结果不能保证哪个先输出,因为线程是由操作系统调度,每次哪个线程在前面可以不同。


给线程传递数据

上面的例子演示了怎样用Thread类来创建一个不带传参的线程,下面我门来创建一个带传入参数的线程。

给线程传递参数,有两种方式:一种是使用带ParameterizedThreadStart委托参数的Thread的构造函数,另外一种是定义一个自定义类。

首先我们使用ParameterizedThreadStart委托来创建有传入参数的类。使用ParameterizedThreadStart,线程的入口(线程调用的方法)必须有一个Object类型的参数,使用Object我们首先想到的就是类型不安全。而且在执行线程的时候多半有装箱拆箱操作。管它的,我们先用这种方式来创建一个带传入参数的线程!!

废话再多,还是没有直接上代码来得实在,看代码!!

static void Main(string[] args)

{

    #region 使用parameterizedThreadStart委托执行带参数的委托

    Thread th2 = new Thread(Thread_param);

    th2.Start(20);

    #endregion

 

    Console.WriteLine("Main Thread");

    Console.ReadKey();

}

 

static void Thread_param(object msg)

{

    int message = (int)msg;

    Console.WriteLine("Result:{0}", message);

}

运行结果:


上面创建的线程是类型不安全的,那用什么样的方式执行带传入参数的线程的方法是类型安全的呢,答案就是创建一个自定义类,在类中定义一个作为传入参数的字段,将线程的主方法定义为一个类的实例方法。然而使用这种方法就可以使用泛型来解决使用ParameterizedThreadStart的类型不安全

class Program

{

    static void Main(string[] args)

    {

        #region 使用自定义类实现带参数的线程

        MyThead<string> myThread = new MyThead<string>("Child_Thread");

        Thread th3 = new Thread(myThread.ThreadChild);

        th3.Start();

        #endregion

 

        Console.WriteLine("Main Thread is going!");

        Console.ReadKey();

    }

 

}//class 

 

class MyThead<T>

{

    private T data;

 

    public MyThead(T data)

    {

        this.data = data;

    }

 

    public void ThreadChild()

    {

        Console.WriteLine("Child Thread Started! Result:{0}", data);

    }

}

运行结果:


后台线程

Thread类默认创建的是前台线程,所以我们前面创建的线程全部都是前台线程。只要有一个前台线程在运行,应用程序的进程就在运行。如果有多个前台线程在运行,而Main()方法(主线程)结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。

那后台线程呢?显然和前台线程相反。当主线程结束后,应用程序的进程就终止了,在所有前台线程结束后,后台线程就会被终止。

在编码的时候我们可以设置Thread类的IsBackground的属性来确定该线程是前台线程还是后台线程。当IsBackground设置为False的时候,为前台线程,设置为Ture的时候为后台线程,下面我们举例来说明前台线程和后台线程的区别。首先我们创建一个前台线程。

static void Main(string[] args)

{

    Thread th_pre = new Thread(Thread_pre) {Name="Thread_pre", IsBackground=false};

    th_pre.Start();

    Console.WriteLine("主线程执行完成");

}

 

static void Thread_pre()

{

    Console.WriteLine("子线程开始执行");

    Thread.Sleep(3000);

    Console.WriteLine("子线程完成执行");

}

执行结果:

下面我们来看看后台线程:

static void Main(string[] args)

{

    Thread th_pre = new Thread(Thread_pre) {Name="Thread_pre", IsBackground=true};

    th_pre.Start();

    Console.WriteLine("主线程执行完成");

}

 

static void Thread_pre()

{

    Console.WriteLine("子线程开始执行");

    Thread.Sleep(3000);

    Console.WriteLine("子线程完成执行");

}

运行结果:

从运行结果可以看出,当主线程结束后,进程就终止了,后台线程也被终止,所以没有后台线程结束的输出信息。


提示:

上面的代码部分有一个C#3.0的新特性,对象初始化设置。

例如,有如下类:

public class Document

{

    public string Title { get; set; }

    public string Content { get; set; }

}

C# 2.0 为 Document 对象的属性赋值,可能通过如下的方式:

Document doc = new Document();

doc.Title = "标题";

doc.Content = "内容";

用了三行代码,能不能更简洁一点呢?可以用构造函数,这的确是个办法,但也不是特别好,因为不是每种情况下构造函数都会把所有的属性列出来。C# 3.0 的对象初始化设置提供了一种方案:

Document doc = new Document { Title = "标题", Content = "内容" };

  • 去掉实例化时的小括号,如果需要构造函数初始化其他成员变量,这里要加上小括号;
  • 增加大括号;
  • 在大括号里为需要赋值的属性赋值。

其实这段代码是这样工作的:

  • 首先,用没有参数的构造函数去实例化对象,如果要初始化其他的成员变量,就不会调用无参的构造函数;
  • 然后,根据大括号中的属性及属性值,为对象属性赋值。

这一节很简单,就是了解一下线程的创建和给线程传递参数的方法,同时说了一个前台线程和后台线程,加入了一个C#3.0的新特性。其他的没有什么。

原文转载地址:http://www.cnblogs.com/lvcy/archive/2012/06/16/2551539.html

[非技术参考]C#基础:使用Thread创建线程(1)的更多相关文章

  1. C#基础:使用Thread创建线程

    Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数.下面我们用一个例子来解释怎样用Thread类 ...

  2. 第十七节:Runnable创建线程,Thread创建线程,唤醒线程和计数器多线程,线程同步与等待

    Runnable创建线程 public class RunnableDemo implements Runnable{ @Override public void run(){ int i = 1; ...

  3. 使用Thread创建线程

    #_author:来童星#date:2019/12/17#使用Thread创建线程import threadingimport timeclass Sunthread(threading.Thread ...

  4. java基础(26):Thread、线程创建、线程池

    1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并 ...

  5. 零基础逆向工程33_Win32_07_创建线程

    1 什么是线程(Threads)? 什么是多线程? 怎么在windows中观察多线程? 线程可以简单理解为主程序为解决一个问题而选择的其中一条路线. 同理,多线程就是同时选择不同的路线来解决此问题. ...

  6. Thread 创建线程

    1.该线程变量 无参数 我们可以把线程的变量 理解为一个 委托.可以指向一个方法.有点像c语言中的指向函数的指针. 第1步我们创建了 Thread变量t1 ,第2步创建了一个方法threadChild ...

  7. 7种创建线程方式,你知道几种?线程系列Thread(一)

    前言 最近特别忙,博客就此荒芜,博主秉着哪里不熟悉就开始学习哪里的精神一直在分享着,有着扎实的基础才能写出茁壮的代码,有可能实现的逻辑有多种,但是心中必须有要有底哪个更适合,用着更好,否则则说明我们对 ...

  8. C/C++ Muti-Thread多线程编程学习(之)线程Thread | 创建、运行、结束

    文章目录 前言 线程 Thread 创建线程 CreateThread _beginthread _beginthreadex pthread_create 线程运行 结束线程 前言   多线程(Mu ...

  9. JAVA通过继承Thread来创建线程

    创建一个线程的第二种方法是创建一个新的类,该类继承Thread类,然后创建一个该类的实例. 继承类必须重写run()方法,该方法是新线程的入口点.它也必须调用start()方法才能执行. 实例 // ...

随机推荐

  1. POJ 3318 - Matrix Multiplication 第一次用随机化解决问题...

    随机化还是很厉害的...印象最深的是以前手写快排~~一般加个随机化会使耗时不受输入数据的..时间更加稳定 这个题是人品题了...开始交了好多遍都过不了..多交几次终于过了... Program: #i ...

  2. 多校联合练习赛1 Problem1005 Deque LIS+LDS 再加一系列优化

    Deque Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. poj 3020 Antenna Placement (最小路径覆盖)

    链接:poj 3020 题意:一个矩形中,有n个城市'*'.'o'表示空地,如今这n个城市都要覆盖无线,若放置一个基站, 那么它至多能够覆盖本身和相邻的一个城市,求至少放置多少个基站才干使得全部的城市 ...

  4. vpn pptp配置

    安装 yum install pptpd 配置pptpd 改动/etc/pptpd.conf设置 localip 192.168.20.1 remoteip 192.168.20.234-238,19 ...

  5. Select标签 依据value值默认选中 Jquery

    网上找了非常多都是错的,不行的. 以下方法能够的 <script type="text/javascript"> $(document).ready(function( ...

  6. json(转)

    转自:http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如何使用J ...

  7. (转)IE劫持原理 BHO

    为什么“浏览器劫持”能够如此猖狂呢?放眼众多论坛的求助贴,我们不时可以看到诸如“我的IE被主页被改了,我用杀毒工具扫了一遍都没发现病毒,我把主页改回自己的地址,可是一重启它又回来了!”.“我的系统一开 ...

  8. CGI version1.1-第一章 介绍 (译)

    CGI version1.1-第一章 介绍 1.简介 1.1 用途 CGI 是为 HTTP服务器 与 CGI脚本 在 响应客户端请求分配职责, 客户请求由url,方法与关于传输协议的附属信息, CGI ...

  9. jQuery treeview的简单用法

    最近的项目要用到treeview插件,刚好就自己整理一下这方面的资料. 1.文档树示例 最简单的一个例子就是文档树的实现.效果如下图所示. 在使用treeview之前,html文档中需要包含几个jqu ...

  10. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...