在上一遍文章中讲到多线程基础,在此篇文章中我们来学习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();//阻塞

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

多线程系列(二)之Thread类的更多相关文章

  1. 【Java多线程系列二】Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法. /* * 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会 */ public s ...

  2. 多线程(二)~Thread类相关的API介绍

      一.线程安全问题:     当我们使用多个线程操作统一方法内的局部变量的时候,每个局部变量在当前线程里都有自己的副本,这种情况是不会出现线程安全问题的.当我们两个线程同时操作全局变量的时候,有可能 ...

  3. java多线程系列(二)

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  4. java多线程系列(二)---对象变量并发访问

    对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...

  5. c# 多线程系列二 自定义线程执行器

    看了第一篇文章,多线程系列,看到了在线程执行任务队列有了一定的了解~! 那么今天我来讲讲,怎么样构建通用的自定义线程概念! 线程执行任务,肯定要有目标,但是如果写死了,那么一个线程处理执行职能按照思路 ...

  6. java多线程(一)之继承Thread类

    一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...

  7. 多线程——Java中继承Thread类与实现Runnable接口的区别

    线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...

  8. Java之多线程方式一(继承Thread类)

    /** * 多线程的创建,方式一:继承于Thread类 * 1. 创建一个继承于Thread类的子类 * 2. 重写Thread类的run() --> 将此线程执行的操作声明在run()中 * ...

  9. C#多线程系列(1):Thread

    目录 1,获取当前线程信息 2,管理线程状态 2.1 启动与参数传递 2.1.1 ParameterizedThreadStart 2.1.2 使用静态变量或类成员变量 2.1.3 委托与Lambda ...

  10. 【Java多线程系列五】列表类

    一些列表类及其特性  类 线程安全 Iterator 特性 说明 Vector 是 fail-fast 内部方法用synchronized修饰,因此执行效率较低 1. 线程安全的列表类并不意味着调用它 ...

随机推荐

  1. presto和hive日期函数对比

    时间格式转换 日期格式→Unix时间戳 转10位Unix时间戳 数据:2020-07-23 15:01:13 Presto:select to_unixtime(cast('2020-07-23 15 ...

  2. Linux系统查看硬件信息神器,比设备管理器好用100倍!

    大家都知道,当我们的 Linux 系统计算机出现问题时,需要对其排除故障,首先需要做的是找出计算机的硬件信息.下面介绍一个简单易用的应用程序--HardInfo,你可以利用它来显示你电脑的每个硬件方面 ...

  3. Python之数据结构:列表、元组、字典、set

    列表 列表里可以存储任意的数据类型.可修改的结构,用[ ]括起来表示或用函数list()构建. eg: y = [1,1.5,'hello',True] 列表还可以嵌套列表 eg: y = [1,1. ...

  4. 将HTML5封装成android应用APK

    借鉴了网上很多的教程终于是把整个过程走通了,最主要的还是墙的问题.... 先是要搭建环境(每一步都要检查,确保安装正确): 1.安装 nodejs 淘宝镜像: npm install -g cnpm ...

  5. MAVEN无法下载com.oracle:jdbc14:jar解决办法

    原文链接:https://www.cnblogs.com/gqzdev/p/11742999.html 第一步,下载ojdbc14jar包: 链接:ojdbc14jar 提取码: 2m59 第二步,下 ...

  6. PHP curl_unescape函数

    (PHP 5 >= 5.5.0) curl_unescape — 解码经过URL编码的字符串. 说明 string curl_unescape ( resource $ch , string $ ...

  7. 读书笔记《数据结构与算法JavaScript描述》第一章

    第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...

  8. 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  9. 服务治理框架dubbo中zookeeper的使用

    Zookeeper提供了一套很好的分布式集群管理的机制,就是它这猴子那个几月层次型的目录树的数据结构,并对书中的节点进行有效的管理,从而可以设计出多种多样的分布式的数据管理模型:下面简要介绍下zook ...

  10. GLIBC_2.18 not found 之类的问题解决办法

    先到 /usr/lib64 下 ll libstdc++* 会发现 libstdc++.so.6 指向了一个新的.比如我这里之前指向6.0.22这个版本,报错 此时只要重新建立软连接 将软连接指向旧的 ...