【多线程】-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("这是后台线程调用");
}
输出结果:
![](http://images2017.cnblogs.com/blog/809005/201709/809005-20170908161143507-591757704.png)
从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。
在这里我要补充的一点是如果把上面代码中的休眠去除会导致产生的结果不一样,这个问题是因为线程执行是无序的。
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):最后打印一下。
直接上结果结束此文:
![](http://images2017.cnblogs.com/blog/809005/201709/809005-20170908170709804-23414876.png)
【多线程】-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线程又称 ...
随机推荐
- 程序员的软实力武器-smart原则
smart对于程序员来说不是仅仅意味一个法则: 面对需求和提出需求时候,smart原则可以极大的提高效率 目标管理是使管理者的工作由被动变为主动的一个很好的管理手段,实施目标管理不仅是为了利于员工更加 ...
- OpenCV特征点检测------Surf(特征点篇)
Surf(Speed Up Robust Feature) Surf算法的原理 ...
- FFMPEG结构体分析:AVCodec
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...
- 《java入门第一季》之面向对象(成员方法)
/* 类的组成:成员变量,成员方法 又加入了一个新的成员:构造方法. 以后再提(类的组成): 成员变量 构造方法 成员方法 根据返回值: void类型 非void类型 形式参数: 空参方法 非空参方法 ...
- "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)
本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...
- 自动生成材质Material(Unity3D开发之十九)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/46854411 ...
- LeetCode(67)-Rotate Array
题目: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ar ...
- Spring 学习笔记 ----依赖注入
依赖注入 有三种方式,本文只学习下属性注入. 属性注入 属性注入即通过 setXxx方法()注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入方式是 ...
- Django之ModelForm
简介 Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 验证 数据库操作 Form回顾 models.py class UserType(mo ...
- python JoinableQueue在生产者消费者项目中的简单应用
class multiprocessing.JoinableQueue([maxsize]) JoinableQueue, a Queue subclass, is a queue which add ...