背景:
在.NET Framework1.0时代就诞生了Thread,也有大量相关的Api支持,thread创建是前台线程
缺陷:
1、一次使用一个线程来创建删除线程,线程的创建和销毁对系统开销比较大
2、在高并发的场景,大量线程创建、销毁会降低响应性能
 
一、构造方法
1.1带参数的委托的构造方法——Thread(ParameterizedThreadStart)
ParameterizedThreadStart构造方法,定义:public delegate void ParameterizedThreadStart(object? obj)带参数的Action委托
public static void Dosomething(object? word)
{
Console.WriteLine(word.ToString());
}
                ParameterizedThreadStart ps = new ParameterizedThreadStart(Dosomething);
Thread thread1 = new Thread(ps);
thread1.Start("埃里克多");

1.2不带参数的构造方法——Thread(ThreadStart)

ThreadStart构造方法,定义:public delegate void ThreadStart();

ThreadStart ts = new ThreadStart(Dothing);
Thread thread2 = new Thread(ts);
thread2.Start();
       public static void Dothing()
{
Console.WriteLine("这是个无参数的方法。。。。");
}

二、相关属性及方法

Thread.Start():启动线程的执行;

  Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;

  Thread.Resume():继续已挂起的线程;

  Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程;

  Thread.Join():阻塞调用线程,直到某个线程终止时为止

  Thread.Sleep():将当前线程阻塞指定的毫秒数,此时线程处于休眠状态,期间此线程不再得到系统分配的执行时间片。

  Thread.Abort():以开始终止此线程的过程。

2.1线程的执行是无序的

                  DisorderVerify();
//多次执行后会得到下面两种结果
//结果一:
//Thread_2 is start
//Thread_1 is start
//结果二:
//Thread_1 is start
//Thread_2 is start
        static void DisorderVerify()
{
Thread thread1 = new Thread(() => Console.WriteLine("Thread_1 is start"));
thread1.Name = "Thread_1"; Thread thread2 = new Thread(() => Console.WriteLine("Thread_2 is start"));
thread2.Name = "Thread_2"; thread1.Start();
thread2.Start();
}

2.2 Thread.join函数

当thread1调用Join方法的时候,主线程MainThread、thread2就被停止执行,直到thread1线程执行完毕,MainThread、thread2存在交叉执行

                for (int i = 0; i < 20; i++)
{
if (i == 4)
{
JoinMethodTest();
}
else
{
Console.WriteLine($"主线程执行:{i}");
} }
        static void JoinMethodTest()
{
Thread thread1 = new Thread(() =>
{
for (int i = 0; i <10; i++)
{
Console.WriteLine("ddd");
} });
Thread thread2 = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("aaa");
} });
thread1.Start();
thread1.Join();
//等待thread1执行完再执行
thread2.Start();
}

执行结果:

                //主线程执行:1
//主线程执行:2
//主线程执行:3
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//ddd
//主线程执行:5
//主线程执行:6
//主线程执行:7
//主线程执行:8
//主线程执行:9
//主线程执行:10
//主线程执行:11
//主线程执行:12
//主线程执行:13
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//aaa
//主线程执行:14
//主线程执行:15
//主线程执行:16
//主线程执行:17
//主线程执行:18
//主线程执行:19

三、前台线程及后台线程

Thread默认创建的为前台线程,可以看到当thread 为前台线程时,即使主线程执行结束,thread也会执行后程序才会结束;当threa为后台线程时,主线程执行结束,程序就结束了。

        public static void BackGroundThreadTest()
{
Thread thread = new Thread(() =>
{
Thread.Sleep(3000);
Console.WriteLine("后台线程测试");
});
thread.IsBackground = true;
thread.Start(); }
                //后台方法测试
BackGroundThreadTest();
Console.WriteLine("主线程结束。。。。");
//打印结果:
//主线程结束。。。。 //将方法里的thread.IsBackground = true;注释
//打印结果:
//主线程结束。。。。
//后台线程测试

C# 线程(二)——Thread学习的更多相关文章

  1. java并发编程学习: 守护线程(Daemon Thread)

    在正式理解这个概念前,先把 守护线程 与 守护进程 这二个极其相似的说法区分开,守护进程通常是为了防止某些应用因各种意外原因退出,而在后台独立运行的系统服务或应用程序. 比如:我们开发了一个邮件发送程 ...

  2. java学习笔记之线程(Thread)

    刚开始接触java多线程的时候,我觉得,应该像其他章节的内容一样,了解了生命周期.构造方法.方法.属性.使用的条件,就可以结束了,然而随着我的深入学习了解,我发现java的多线程是java的一个特别重 ...

  3. 从零开始构建一个Reactor模式的网络库(二)线程类Thread

    线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...

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

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

  5. 201871010105-曹玉中《面向对象程序设计(java)》第十二周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

  7. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  8. 【转】线程、Thread类和线程终止

    一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...

  9. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  10. 线程(Thread,ThreadPool)、Task、Parallel

    线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Fr ...

随机推荐

  1. 云安全CIA:关键信息保证的三大支柱

    本文分享自天翼云开发者社区<云安全CIA:关键信息保证的三大支柱>,作者:每日知识小分享 随着云计算的迅速普及,云安全问题越来越受到关注.云安全涉及的范围广泛,涵盖了云端数据中心的物理安全 ...

  2. JAVA8——StringJoiner类

    引言:在阅读项目代码是,突然看到了StringJoiner这个类的使用,感觉很有意思,对实际开发中也有用,实际上是运用了StringBuilder的一个拼接字符串的封装处 介绍 StringJoine ...

  3. Q:jar包启动脚本备份

    jarServer.sh #!/bin/bash #APP_NAME必须配置. cd `dirname $0` cd .. DEPLOY_DIR=`pwd` APP_HOME=$DEPLOY_DIR/ ...

  4. 4.vue Router路由设置

    router=>index.js 设置路由信息 1.路由文件按分组拆分多个 import analysisRouter from './analysisRouter'; import users ...

  5. .NET Core 托管堆内存泄露/CPU异常的常见思路

    常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root ...

  6. python实现批量自动访问站点URL并获取内容,自动模拟打开电脑端及移动端URL访问站点,打开URL页面获取页面内容

    问题描述:假设目前有多个网站URL,需要检查各站点keyword,description是否正常设置,如果人工逐个打开URL访问比较耗时,故采用python模拟电脑端和移动端自动打开网站URL访问,并 ...

  7. go 定义接口解决 import cycle not allowed

    前言 go项目运行报错: import cycle not allowed,导入循环(import cycle) 报错原因,在Go语言中,两个或更多的包之间形成了相互依赖的关系,即A包导入了B包,而B ...

  8. 如何学习 ROS+PX4

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考 https://www.bilibili.com/video/BV1vx4y1Y7Tu?spm_id_from=33 ...

  9. SQL索引失效的场景有哪些

    SQL优化里面主要是围绕索引来展开的,SQL优化的一大重点就是避免索引失效,因为索引失效就会导致全表扫描,数据量很大的情况下能明显感受到查询速度的降低. 下面说说索引失效的各种场景. 使用索引的时候, ...

  10. 关于DevExpress VCL汉化方法

    用法1:在工程中加入控件cxLocalizer; 在程序中加入如下语句: Localizer.LoadFromFile('DevLocal.ini'); Localizer.Language := ' ...