背景:
在.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. 2024大湾区网络安全大会,AOne来了!

    近日,2024大湾区网络安全大会暨第二十六期花城院士科技会议在广州启幕.学者专家.高校院长.政府相关负责人及行业大咖齐聚一堂,围绕网络安全的前沿话题与挑战展开深入交流与探讨.天翼云科技有限公司网络安全 ...

  2. linux mint安装kafka,及flume与kafka整合

    需要软件 jdk1.8(jdk-8u131-linux-x64.rpm) zookeeper (zookeeper-3.4.10.tar.gz) kafka 2.11-2.0.0 flume1.8.0 ...

  3. Doris建明细测试表,导入测试数据

    分区.分桶.明细表 测试用户表 CREATE TABLE user_info( dt DATE, id varchar(36) NOT NULL DEFAULT '10', user_name var ...

  4. C# 深度学习:对抗生成网络(GAN)训练头像生成模型

    通过生成对抗网络(GAN)训练和生成头像 目录 通过生成对抗网络(GAN)训练和生成头像 说明 简介 什么是 GAN 什么是 DCGAN 参数说明 数据集处理 权重初始化 生成器 判别器 损失函数和优 ...

  5. 【忍者算法】从生活场景理解链表反转:最重要的基础算法|LeetCode第206题 反转链表

    从生活场景理解链表反转:最重要的基础算法 为什么这道题如此重要 反转链表看似简单,却是链表操作的基石.就像建房子要先打好地基,做复杂的链表操作前必须深刻理解反转原理.无数高频面试题都建立在这个基础之上 ...

  6. MarkDown学习使用图片

    学习MarkDown使用

  7. 库卡机器人KR500维修保养

    随着现代工业自动化,KUKA库卡机器人以其卓越的性能.灵活的操作和高效的产出而备受赞誉.然而,为了确保机器人的持续稳定运行和延长使用寿命,应联系子锐机器人维修对库卡机器人保养至关重要. 一.库卡机器人 ...

  8. Deepseek学习随笔(1)--- 初识 DeepSeek

    什么是 DeepSeek? DeepSeek 是一款基于人工智能的对话工具,旨在帮助用户高效完成各种任务,包括文本生成.代码编写.数据分析等.通过自然语言处理技术,DeepSeek 能够理解用户的输入 ...

  9. 补充:基于项目的协同过滤推荐算法(Item-Based Collaborative Filtering Recommendation Algorithms)

    前言 继续上篇博客,继续读论文. 想看上篇论文的同学可以点击这里 相关工作 In this section we briefly present some of the research litera ...

  10. 震惊!C++程序真的从main开始吗?99%的程序员都答错了

    嘿,朋友们好啊!我是小康.今天咱们来聊一个看似简单,但实际上99%的C++程序员都答错的问题:C++程序真的是从main函数开始执行的吗? 如果你毫不犹豫地回答"是",那恭喜你,你 ...