【多线程】-Thread
Thread介绍(实例化):
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。微软官网给出的构造函数解释是:
1.Thread(ParameterizedThreadStart):初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托--------带参数。
2.Thread(ThreadStart):初始化 Thread 类的新实例------不带参数。
在c#中使用可以不予区分,我们只需要实例化即可,c#会自动给我们调用相应构造函数。所以我们不必关系这两个函数。我们简单创建一个例子:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
//IsBackground=true,将其设置为后台线程
Thread t = new Thread(Run) { IsBackground = true };
t.Start();
Console.WriteLine("主线程继续执行!");
//主线程结束,后台线程会自动结束,不管有没有执行完成
//Thread.Sleep(300);
Thread.Sleep(1500);
Console.WriteLine("主线程结束");
Console.ReadKey();
}
static void Run()
{
Thread.Sleep(700);
Console.WriteLine("这是后台线程调用");
}
输出结果:

从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。
在这里我要补充的一点是如果把上面代码中的休眠去除会导致产生的结果不一样,这个问题是因为线程执行是无序的。
Thread中的属性:
CurrentCulture:获取或设置当前线程的区域性。(这个暂时没研究)
CurrentThread:获取当前正在运行的线程。(即在当前线程内要获取所运行的线程,返回的是当前运行线程,配合其他属性来获取数据)
IsAlive:获取一个值,该值指示当前线程的执行状态。(返回bool类型,如果此线程已启动并且尚未正常终止或中止返回true,否则为false)
IsBackground:下面会特殊说明一下。
ManagedThreadId:获取当前托管线程的唯一标识符。(当前线程的id,返回值为int类型,代表当前线程号,配合CurrentThread使用)
Name:获取或设置线程的名称。(自定义给线程设置一个标识名称,配合CurrentThread使用)
ThreadState:获取一个值,该值包含当前线程的状态。(返回当前线程的状态,枚举类型)
Priority:获取或设置指示线程的调度优先级的值。
# Thread中的前台后台:
在创建Thread中我们可以选中设置为前台线程或者后台线程(默认为前台进程):
IsBackground 属性:
官方解释 :获取或设置一个值,该值指示某个线程是否为后台线程。
自我理解:就是设置一个true或者false,当为true时则表示为后台线程,当为false时为前台线程。
在这里不得不提的是前台线程和后台线程存在的差别,应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。即当设置为false时即使用户关闭当前主程序,进程不一定关闭,因为线程是寄托在进程上的,前台线程未退出,当前进程就不会终止。(在资源管理器中仍可以看到进程)
Thread中的常用方法:
我们使用Thread创建线程后,我们需要对线程进行控制。
1、 使用Start()方法使线程处于Running状态,线程开始执行。
2、 使用Join()方法使线程处于WaitSleepJoin状态,在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时 间为止。
3、 使用Sleep()方法,也会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会被再次唤醒。、
4、 使用Abort()方法,会使线程处于ResetAbort()状态,线程在接到这个命令的时候,会抛出一个ThradAbordException类型的异常。
在上面的方法基础上我们修改一下代码来看结果:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
//IsBackground=true,将其设置为后台线程
Thread t = new Thread(Run);
t.Start();
Console.WriteLine("newThread State:{0}", t.ThreadState);
Console.WriteLine("主线程继续执行!");
t.Join(100);
Console.WriteLine("newThread State:{0}", t.ThreadState);
//主线程结束,后台线程会自动结束,不管有没有执行完成
t.Abort();
Console.WriteLine("主线程结束");
Console.ReadKey();
}
static void Run()
{
// Thread.Sleep(700);
Console.WriteLine("这是后台线程调用");
}
输出结果:

Thread中数据传递:
上面也说了在c#中线程方法传递数据可以直接调用,下面我们就在上面方法的地方修改一下即可:
t.Start(100):在启动线程的时候把需要的参数传递进去。
static void Run(object nub):方法上面加上参数,这里大家都知道就不多了。
Console.WriteLine("这是传递数据{0}",nub):最后打印一下。
直接上结果结束此文:

【多线程】-Thread的更多相关文章
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- 多线程-Thread和ThreadPool
多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...
- Java多线程Thread
转自:http://www.cnblogs.com/lwbqqyumidi/p/3804883.html Java总结篇系列:Java多线程(一) 多线程作为Java中很重要的一个知识点,在此还是 ...
- java 多线程--- Thread Runnable Executors
java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...
- python进阶学习笔记(四)--多线程thread
在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...
- php多线程thread开发与应用的例子
Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/kra ...
- 多线程(Thread),其实很简单!
目录: 1:线程简介 2:怎么操作线程 3:Thread的常用方法 4:简单的获奖机 5:应用程序域 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线 ...
- 【C#多线程】C#多线程 Thread 开发基础
引用 using System; using System.Threading; 多线程代码 Thread mainthread = new Thread(ExecuteThread); mainth ...
- android 多线程Thread,Runnable,Handler,AsyncTask
先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...
随机推荐
- Linux 用户打开进程数的调整
Linux 用户打开进程数的调整 参考文章: 关于RHEL6中ulimit的nproc限制(http://www.cnblogs.com/kumulinux/archive/2012/12/16/28 ...
- AP INVOICES IMPORT API(NOT request)
PROCEDURE process_cux_to_ap(x_return_status OUT NOCOPY VARCHAR2, x_msg_count OUT NOCOPY NUMBER, x_ms ...
- 【Android 应用开发】AndroidUI设计 之 图片浏览器
图片浏览器效果图 : 源码下载地址 : -- CSDN : http://download.csdn.net/detail/han1202012/6875083 -- GitHub : https:/ ...
- 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- Android 之dragger使用
1.依赖的注入和配置独立于组件之外,注入的对象在一个独立.不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库. 2.依赖可以注入到一个组件中:我们可以注入这些依赖 ...
- Mondrian Schema workbench工作界面 简介(实在懒得写,居然有人弄了,收藏了)
转自:http://hi.baidu.com/dinguangx/item/37e78be29aebc1adcf2d4f89 Schema Schema 定义了一个多维数据库.包含了一个逻辑模型,而这 ...
- iOS监听模式系列之iOS开发证书、秘钥
补充--iOS开发证书.秘钥 iOS开发过程中如果需要进行真机调试.发布需要注册申请很多证书,对于初学者往往迷惑不解,再加上今天的文章中会牵扯到一些特殊配置,这里就简单的对iOS开发的常用证书和秘钥等 ...
- C语言笔试经典--求分数数列的和
题目: 求数组的和 2 3/2 5/3 8/5 13/8 21/13 ... 求前20项的和 //求分数数列的和 #include<stdio.h> // ...
- 如何获取自己想要模拟的APP的相关图片?
一.首先打开iTunes APP,找到自己想要模拟实现的APP,并下载 二.找到下载的APP在iTunes中的位置 三.选中对应的APP,点击右键选择在Finder中显示,会打开对应的文件窗口,打开对 ...
- obj-c编程06:反射与元编程初步
我们知道对于现如今的动态语言比如ruby而言,反射和元编程以及支持的非常灵活了,你完全可以跳过常规的手段,而利用反射来查询或调用对象的私有方法.而obj-c对反射的支持略显小繁琐,而且在开了ARC后同 ...