在上一遍文章中讲到多线程基础,在此篇文章中我们来学习C#里面Thread类。Thread类是在.net framework1.0版本中推出的API。如果对线程的概念还不太清楚

的小伙伴请阅读我的上一遍文章:多线程系列(一),多线程基础

在本篇文章中新开启一个线程来异步调用的方法代码为:

        private void DoSomeThing(string btnName) {
Console.WriteLine($"{btnName} 开始,当前线程id:{Thread.CurrentThread.ManagedThreadId}");
long lResult = ;
for (long i = ; i < 1_00_000_000; i++)
{
lResult += i;
}
Console.WriteLine($"{btnName} 结束,当前线程id:{Thread.CurrentThread.ManagedThreadId}");
}

如何使用Thread来开启一个新的线程?

方式一:基于委托ParameterizedThreadStart

                ParameterizedThreadStart method = o => this.DoSomeThing("btnThread_Click");
Thread thread = new Thread(method);
thread.Start();//开启线程,执行委托的内容

方式二:基于委托ThreadStart

                ThreadStart method = () =>
{
Thread.Sleep();
this.DoSomeThing("btnThread_Click");
};
Thread thread = new Thread(method);
thread.Start();//开启线程,执行委托的内容

线程的暂停(挂起)、休眠、继续、终止

thread.Suspend();//暂停,挂起线程,如果线程已经挂起,则不起作用

thread.Resume();//继续已经挂起的线程

thread.Abort();//终止线程,会在当前线程中抛出一个异常引发线程停止,不过会有延迟,因为线程属于计算机资源,程序想停下线程,只能向操作系统通知(抛异常),不一定真的能停下来

Thread.ResetAbort();//终止当前线程,取消当前线程的所有请求,只能终止一次

Thread.Sleep();//使当前线程休眠多少毫秒再继续执行

线程等待

方式一:通过thread.ThreadState获取当前线程的状态

                while (thread.ThreadState != System.Threading.ThreadState.Stopped)
{
Thread.Sleep();
Console.WriteLine($"线程_{ thread.ManagedThreadId.ToString("")}_正在运行中...");
}

方式二:通过Join等待

thread.Join(); //等待线程thread执行完毕

thread.Join(5000); //限时等待,最多等待5000毫秒

线程的优先级

thread.Priority = ThreadPriority.Highest;

设置线程的优先级为最高优先级:优先执行,但不代表优先完成,甚至说极端情况下,还有意外发生,不能通过这个来控制线程的执行先后顺序

前台线程与后台线程

thread.IsBackground = false;//默认是false 前台线程,进程关闭,线程需要计算完后才退出

thread.IsBackground = true; //关闭进程,线程退出

线程的回调

我们希望某个线程在执行某个动作之后触发另一个动作,下面是我基于Thread封装的线程回调函数

        /// <summary>
/// 基于thread封装一个回调,启动子线程执行动作A--不阻塞--A执行完后子线程会执行动作B,不阻塞
/// </summary>
/// <param name="method">动作A</param>
/// <param name="action">动作B</param>
private void ThreadWithCallBack(ThreadStart method,Action action)
{
ThreadStart threadStart = () =>
{
method.Invoke();
action.Invoke();
};
new Thread(threadStart).Start();
}

调用测试代码:

        ThreadStart method = () =>
{
this.DoSomeThing("btnThread_Click");
};
Action actionCallBack = () =>
{
Console.WriteLine("method 的回调");
};
this.ThreadWithCallBack(method, actionCallBack);

获取子线程的返回值

下面是我基于Thread封装的获取子线程的返回值函数

        T t = default(T);
ThreadStart threadStart = () =>
{
t = func.Invoke();
};
Thread thread = new Thread(threadStart);
thread.Start(); return new Func<T>(() => {
thread.Join();
return t;
});

调用测试代码

        Func<int> func = () => {
return DateTime.Now.Hour;
};
Func<int> funcThread = this.ThreadWithReturn<int>(func);//非阻塞
int res = funcThread.Invoke();//阻塞

在下一篇中,会继续讲到线程池

最新文章

  1. 企业做数据缓存是使用Memcached还是选Redis?
  2. MySQL报错:Got error 28 from storage engine
  3. SQL排序
  4. 工作中碰到的js问题(disabled表单元素不能提交到服务器)
  5. JSON.parse()和JSON.stringify()的区别
  6. JS点击复制
  7. [精校版]The Swift Programming Language
  8. 2437: [Noi2011]兔兔与蛋蛋 - BZOJ
  9. Android进阶笔记12:Manymo(在线安卓系统模拟器工具)
  10. uva 10034
  11. HDU 1203 I NEED A OFFER! 01背包
  12. Hadoop在Windows环境下的部署[转]
  13. easyui之datagrid(不定时补充)
  14. xcode5.1上真机调试报告No architectures to compile for...的解决办法
  15. 转换number为千分位计数形式js
  16. vue项目中解决type=”file“ change事件只执行一次的问题
  17. [Shiro] tutorial 1 :SecurityManager and Subject
  18. Linux常用命令英文全称与中文解释
  19. 牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望
  20. [原][粒子特效][spark]发射器emitter

热门文章

  1. js原声代码 轮播图
  2. MacOS下smartSVN使用教程
  3. Python time localtime()方法
  4. PHP imagechar - 写出横向字符
  5. PHP imageaffinematrixconcat - 连接两个矩阵
  6. IDEA、maven创建webapp项目
  7. Pandas 数据处理 | Datetime 在 Pandas 中的一些用法!
  8. 当asp.net core偶遇docker一(模型验证和Rabbitmq 二)
  9. Android menu菜单的深入了解。。。
  10. 简单认识JAVA内存划分