当前位置: 首页 > news >正文

【C#补全计划】多线程

一、进程

1. 概念:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

2. 进程之间可以相互独立运行、互不干扰,也可以相互访问、操作

二、线程

1. 概念:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位

2. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程

三、多线程的语法

1. 类:Thread

2. 引用命名空间:using System.Threading;

3. 声明一个新线程:Thread 线程名 = new Thread();

using System;
using System.Threading;namespace Multithreading
{class Program{static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);}static void threadMethod1(){Console.WriteLine("线程1的逻辑...");}}
}

4. 启动线程:线程名.Start();

using System;
using System.Threading;namespace Multithreading
{class Program{static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();}static void threadMethod1(){Console.WriteLine("运行线程1的逻辑...");}}
}

5. 设置为后台线程:线程名.IsBackground = true;

        (1)当所有前台线程结束的时候,整个程序就结束了。无论是否还有后台线程在运行。

        (2)后台线程会随着应用程序进程的终止而终止

        (3)如果不设置为后台线程,可能导致进程无法正常关闭

        (4)若线程1无限循环:

using System;
using System.Threading;namespace Multithreading
{class Program{static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();}static void threadMethod1(){while (true) {Console.WriteLine("运行线程1的逻辑...");}}}
}

运行结果如下:(无限循环执行)

        (5)设置线程1为后台线程:

using System;
using System.Threading;namespace Multithreading
{class Program{static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();// 设置为后台线程t1.IsBackground = true;for (int i = 0; i < 10; ++i) {Console.WriteLine("运行主线程的逻辑...");}}static void threadMethod1(){while (true) {Console.WriteLine("运行线程1的逻辑...");}}}
}

运行结果如下:(主线程结束后线程1也结束)

6. 释放线程:

        (1)如果开启的线程不是死循环,不需要刻意去关闭

        (2)如果开启的线程是死循环,有两种关闭方式:

                ①设置bool标识

using System;
using System.Threading;namespace Multithreading
{class Program{static bool isRuning = true;static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();// 设置为后台线程t1.IsBackground = true;for (int i = 0; i < 10; ++i) {Console.WriteLine("运行主线程的逻辑...");}// 释放线程// 1.设置bool标识isRuning = false;}static void threadMethod1(){while (isRuning) {Console.WriteLine("运行线程1的逻辑...");}}}
}

运行结果如下:

                ②调用线程提供的Abort方法

using System;
using System.Threading;namespace Multithreading
{class Program{// static bool isRuning = true;static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();// 设置为后台线程t1.IsBackground = true;for (int i = 0; i < 10; ++i) {Console.WriteLine("运行主线程的逻辑...");}// 释放线程// 1.设置bool标识// isRuning = false;// 2.使用线程的Abort方法t1.Abort();}static void threadMethod1(){while (true) {Console.WriteLine("运行线程1的逻辑...");}}}
}

运行结果同上。

注意:在.Net core版本中无法中止,会发生报错

7. 休眠线程:Thread.Sleep();

using System;
using System.Threading;namespace Multithreading
{class Program{// static bool isRuning = true;static void Main(string[] args){// 声明一个新线程// 注意:线程执行的代码需要封装到一个新函数中Thread t1 = new Thread(threadMethod1);// 启动线程t1.Start();// 设置为后台线程t1.IsBackground = true;for (int i = 0; i < 10; ++i) {Console.WriteLine("运行主线程的逻辑...");}// 释放线程// 1.设置bool标识// isRuning = false;// 2.使用线程的Abort方法t1.Abort();// 休眠线程// 在哪个函数中调用,就使哪个线程休眠Thread.Sleep(1000); // 使线程休眠1000毫秒 1秒=1000毫秒}static void threadMethod1(){while (true) {Console.WriteLine("运行线程1的逻辑...");}}}
}

四、线程之间共享数据

1. 多个线程之间使用的内存使共享的,都属于应用程序(进程)

2. 要注意:当多线程同时操作同一片内存区域时可能会出问题,但是可以通过加锁的形式避免

http://www.dtcms.com/a/335699.html

相关文章:

  • GitLab CI/CD、Jenkins与GitHub Actions在Kubernetes环境中的方案对比分析
  • 基于SpringBoot的在线拍卖系统,免费附源码
  • JMeter(入门篇)
  • java基础(十)sql的mvcc
  • WebSocket--精准推送方案(二):实时消息推送-若依项目示例
  • 本地处理不上传!隐私安全的PDF转换解决方案
  • java_spring boot 中使用 log4j2 及 自定义layout设置示例
  • Ansible 管理变量和事实
  • 计算机毕设选题推荐-基于大数据的全面皮肤病症状数据可视化分析系统【Hadoop、spark、python】
  • 麒麟V10静默安装Oracle11g:lsnrctl、tnsping等文件大小为0的解决方案
  • Android 对话框 - 基础对话框补充(不同的上下文创建 AlertDialog、AlertDialog 的三个按钮)
  • Pandas数据结构详解Series与DataFrame
  • 智能汽车领域研发,复用云原始开发范式?
  • 笔记本电脑wifi小图标不见了 或者 蓝牙功能消失、电脑开不开机解决方法
  • 深入理解C#特性:从应用到自定义
  • CentOS启动两个MySQL实例
  • C#对象的本地保存与序列化详解笔记
  • [每周一更]-(第155期):Go 1.25 发布:新特性、技术思考与 Go vs Rust 竞争格局分析
  • 【前端面试题】前端面试知识点(第三十一题到第六十一题)
  • 项目发布上线清单
  • neo4j导入导出方法
  • 《设计模式》抽象工厂模式
  • 链表OJ题讲解---试金石含金量
  • RabbitMQ入门:生产者和消费者示例
  • Java注解学习记录
  • 什么是EDA(Exploratory Data Analysis,探索性数据分析)
  • AI出题人给出的Java后端面经(十七)(日更)
  • 第 463 场周赛(GPT-3,Me-1)
  • Foreign-Memory Access API外部内存API
  • 混沌工程(Chaos engineering):系统韧性保障之道