首页 > 系统相关 >进程,线程,线程生命周期,原生线程,线程调度,Thread,ThreadPool,Task,Parallel,线程安全容器

进程,线程,线程生命周期,原生线程,线程调度,Thread,ThreadPool,Task,Parallel,线程安全容器

时间:2023-10-25 12:08:46浏览次数:22  
标签:Task Thread ThreadPool 获取 线程 完成 执行

1.进程;程序在服务器上运行时,占用的计算机资源合集,就是进程

2.线程:是程序能够独立运行的最小单位,共享进程的资源;

3.线程的生命周期:
3.1 新建,启动,可运行,正在运行,new,start,runnable,running,dead,blocked阻塞

4.原生线程:由操作系统负责创建、运行、切换、终止的线程就是原生线程

5.线程的调度:轮转调度,优先级调度,由操作系统控制管理,根据资源闲忙情况决定

6..net core托管线程Thread

7.thread 线程
.net程序里thread 有属性,有常用方法

7.1常用属性
CurrentThread 获取当前正在运行的线程。
IsAlive 获取指示当前线程的执行状态的值。
IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。
IsThreadPoolThread 获取指示线程是否属于托管线程池的值。
ManagedThreadId 获取当前托管线程的唯一标识符。
Name 获取或设置线程的名称。
Priority 获取或设置指示线程的调度优先级的值。
ThreadState 获取一个值,该值包含当前线程的状态。

7.2常用方法
Start() 导致操作系统将当前实例的状态更改为 Running。
Sleep(TimeSpan) 将当前线程挂起指定的时间。
Join() 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻止调用线程,直到由该实例表示的线程终止。
GetDomainID() 返回唯一的应用程序域标识符。
Suspend() 已过时。挂起线程,或者如果线程已挂起,则不起作用。
Resume() 已过时。继续已挂起的线程。
Finalize() 确保垃圾回收器回收 Thread 对象时释放资源并执行其他清理操作。
Abort() 在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。
ResetAbort() 取消当前线程所请求的 Abort(Object)。

7.3 Thread的缺陷:
官方提供了丰富的API,Thread操纵的是托管线程,然后对CPU发出指令,操控原生线程。这就导致响应不灵敏,无法很好的控制线程。
Thread对启动线程数量不设控制,如果使用不当,会造成死机。

8.ThreadPool(Framework2.X)

ThreadPool缺陷
1.提供的API太少了,无法操控线程。虽然可以使用ManualResetEvent来进行阻塞和恢复线程,但是操作还是不方便

  1. Task(Framework4.X)
    9.1Task:
    1.类 Task 表示一个不返回值且通常异步执行的单个操作
    2.派生类 Task 表示返回值且通常异步执行的单个操作
    3.Task的工作通常以异步方式在线程池线程上执行

9.2 Task的属性:
CompletedTask 获取一个已成功完成的任务。
CurrentId 返回当前正在执行 Task 的 ID。
Exception 获取导致 AggregateException 提前结束的 Task。 如果 Task 成功完成或尚未引发任何异常,这将返回 null。
Factory 提供对用于创建和配置 Task 和 Task 实例的工厂方法的访问。
IsCompleted 获取一个值,它表示是否已完成任务。

9.3 Task的方法:
Start() 启动 Task,并将它安排到当前的 TaskScheduler 中执行。
Run(Action) 将在线程池上运行的指定工作排队,并返回代表该工作的 Task 对象。
Delay(Int32) 创建一个在指定的毫秒数后完成的任务。
ContinueWith(Action) 创建一个在目标 Task 完成时异步执行的延续任务。
Dispose() 释放 Task 类的当前实例所使用的所有资源。
Wait() 等待 Task 完成执行过程。
WhenAny(Task[]) 非阻塞,任何提供的任务已完成时,创建将完成的任务。
WhenAll(Task[]) 非阻塞,创建一个任务,该任务将在数组中的所有 Task 对象都已完成时完成。
WaitAny(Task[]) 阻塞线程,等待提供的任一 Task 对象完成执行过程。
WaitAll(Task[]) 阻塞线程,等待提供的所有 Task 对象完成执行过程。

  1. parallel(TPL)(Framework4.5)
    Parallel 数据并行(任务并行库)简单理解就是 Task WaitAll + 主线程(参与计算)
    数据并行指的是对源集合或数组的元素同时(即,并行)执行相同操作的场景。 在数据并行操作中,对源集合进行分区,以便多个线程能够同时在不同的网段上操作

10.1 常用方法
Paraller.For()、Parallel.ForEach()、Parallel.Invoke()

10.2 修改parallel线程数量

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 3;

  1. 线程安全容器
    ConcurrentBag 表示对象的线程安全的无序集合。
    ConcurrentDictionary 表示可由多个线程同时访问的键/值对的线程安全集合。
    ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合。
    ConcurrentStack 表示线程安全的后进先出 (LIFO) 集合。



标签:Task,Thread,ThreadPool,获取,线程,完成,执行
From: https://blog.51cto.com/chenshaojun/8016247

相关文章

  • Qt - 多线程之QtConcurrent::run()
    QT多线程之QtConcurrent::run()QT有几种可以实现多线程编程的方式,其中最方便使用,最便携的一定是QtConcurrent::run()了,这是一个模板函数,有很多的重载原型。//在新的线程中调用普通函数template<typenameT>QFuture<T>QtConcurrent::run(Functionfunction,...)//使用线......
  • 线程池笔记
    日常所说的“核心线程”、“非核心线程”是一个虚拟的概念,是为了方便描述而虚拟出来的概念在代码中并没有标记哪些线程为“核心线程”或者“非核心线程”。所有线程都是一样的。线程池是如何实现的?  在Java中,线程池中所谓的“线程”,其实就是一个静态内部类Worker,它是基于......
  • 什么是线程池?工作中线程池的应用
    一、什么是线程池简单理解,它就是一个管理线程的池子。它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。提高响应速度。如果任务到达了,相对于从线程池拿线程,......
  • 为什么单线程Redis能那么快
    单线程澄清Redis的单线程,指的是Redis的键值对读写由一个线程来完成。Redis的多线程:持久化异步删除集群数据同步网络IO(Redis6.0引入,5.0及之前都是单线程)......
  • 线程池
    codeimportosimporttimefromconcurrent.futures.threadimportThreadPoolExecutordeftest(n):print(f'n:{n}-os.getpid:{os.getpid()}')time.sleep(2)return'hello'#定义一个回调函数,异步提交完后,有结果自动调用该函数defcall_back(n):p......
  • c: thread in Ubuntu 22.04
     /***@filehelloworld.c*@authoryourname([email protected])*@briefthread*@version0.1*@date2023-10-24*ide:vscodec11,c17Ubuntu22.04*@copyrightCopyright(c)2023站在巨人的肩膀上StandingontheShouldersofGiants2023**......
  • 升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据
    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。客户组织多名客服上线后,所有员工同一时间打开访客页面疯狂不停的给在线客服发消......
  • 在C++中,互斥变量(std::mutex)是用于保护共享资源的重要工具,但它们确实有一些局限性,其中
    在C++中,互斥变量(std::mutex)是用于保护共享资源的重要工具,但它们确实有一些局限性,其中之一是无法保证包含指针的区域的多线程安全。这是因为互斥锁本质上只能保护它们所保护的代码块,而不会考虑指针指向的数据。下面是一些与互斥锁和指针相关的常见问题和注意事项:共享数据的复制:......
  • Chromium 消息循环和线程池详解
    Chromium中的多线程机制由base库提供,要理解Chromium中的多线程机制,首先要理解的概念就是 base::MessageLoop 和 base::TaskScheduler ,它们两个是Chromium多线程的基础1. MessageLoop详解base::MessageLoop 代表消息循环,它不会主动创建新的线程,默认情况下它使用当前......
  • Java使用多线程异步执行批量更新操作方法
    一、核心技术Java提供了Executor框架来实现多线程任务的执行。我们可以通过创建ExecutorService对象来管理线程池,然后将任务提交给这个线程池执行。Executor框架的优点在于,它可以自动管理线程数量,以最大化利用CPU和内存资源。二、具体实现方法1、创建一个数据更新任务类,实现Run......