首页 > 其他分享 >独立线程按照推入的任务时间顺序执行任务

独立线程按照推入的任务时间顺序执行任务

时间:2024-07-01 10:44:08浏览次数:16  
标签:thread ThreadTaskChanel void taskQueue 任务 线程 new public 推入

一、模型背景

有时,代码需要交个其他线程处理,也不关心执行的进度,但是关心执行的顺序。

二、代码实现

    public class ThreadTaskChanel : IDisposable
    {

        // 创建任务队列
        private ConcurrentQueue<Action> _taskQueue = new ConcurrentQueue<Action>();

        // 创建事件
        private AutoResetEvent _taskAvailableEvent = new AutoResetEvent(false);

        private Thread _thread;

        public ThreadTaskChanel()
        {
            _thread = new Thread(() =>
            {
                while (true)
                {
                    if (_taskQueue.IsEmpty)
                        _taskAvailableEvent.WaitOne();

                    Action task;
                    if (_taskQueue.TryDequeue(out task))
                    {
                        try
                        {
                            task();
                        }
                        catch { }
                    }
                }
            });
            _thread.IsBackground = true;
            _thread.DisableComObjectEagerCleanup();
        }

        ~ThreadTaskChanel()
        {
            Dispose();
        }

        public void Start()
        {
            _thread?.Start();
        }

        public void Stop()
        {
            try
            {
                _thread?.Abort();
            }
            catch { }
        }


        public void PushToWork(Action action)
        {
            _taskQueue.Enqueue(action);
            _taskAvailableEvent.Set();
        }

        public void Dispose()
        {
            Stop();
        }
    }

三、调用

            ThreadTaskChanel threadTaskChanel = new ThreadTaskChanel();
            threadTaskChanel.Start();

            while (true) 
            {
                threadTaskChanel.PushToWork(() => {

                    Console.WriteLine($"{DateTime.Now.ToString("yyyy:MM:dd:HH:mm:ss")}  working...");
                });

                Thread.Sleep(1000);
            }

        }

 

标签:thread,ThreadTaskChanel,void,taskQueue,任务,线程,new,public,推入
From: https://www.cnblogs.com/xietianjiao/p/18277555

相关文章

  • Java中线程的run()和start()有什么区别?
    在Java中,run() 方法和 start() 方法在线程的使用中有重要区别:run() 方法:当您直接调用线程对象的 run() 方法时,它会在当前线程中执行 run() 方法中的代码,不会启动新的线程。这就相当于普通的方法调用,不会实现多线程的并发执行效果。start() 方法:调用线程对象的 ......
  • LINUX系统编程:多线程互斥
    目录1.铺垫2.线程锁接口的认识静态锁分配动态锁的分配互斥量的销毁互斥量加锁和解锁3.加锁版抢票4.互斥的底层实现1.铺垫先提一个小场景,有1000张票,现在有4个进程,这四个进程疯狂的去抢这1000张票,看看会发生什么呢?#include<iostream>#include<thread>#include......
  • 如何借助 LLM 设计和实现任务型对话 Agent
    1引言在人工智能的快速发展中,任务型对话Agent正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互,专注于高效执行特定任务,如预订酒店或查询天气。尽管市场上的开源框架如Rasa和MicrosoftBotFramework在对话理解和管理方面已经取得了不错的进展,但仍......
  • 多线程详解
    多线程详解1.线程简介任务,进程,线程,多线程多任务吃饭的时候玩手机,,,现实之中大多这样同时做多件事情的例子,看起来是多个任务都在做,其实本质上我们的大脑只做了一件事多线程原来是一条路,慢慢因为车多了,道路堵塞,效率极低,为了提高使用的效率,能够充分利用道路,于是加了多个车道。......
  • 线程进程以及多线程多进程(超详解)
    目录前言一、什么是进程和线程进程(Process)线程(Thread)多线程(Multithreading)多进程(Multiprocessing)相互组合关系二、资源分配进程私有资源共享资源线程私有资源共享资源多进程私有资源共享资源多线程私有资源共享资源进程的共享和私有资源线......
  • js 微任务 宏任务区别
    微任务和宏任务是与事件循环相关的概念,用于管理异步操作的执行顺序。宏任务(macrotask)通常包括整体代码块、setTimeout、setInterval、I/O、UI渲染等,它们会被放入宏任务队列中,等待事件循环执行。微任务(microtask)包括Promise、process.nextTick、Object.observe、MutationObs......
  • 【协同任务】多无人机协同任务【含Matlab源码 1273期】
    ......
  • 【C语言】线程同步
    【C语言】线程同步线程同步1.互斥锁2.读写锁3.条件变量4.信号量最后线程同步  线程同步是指在多线程的情况下,如果多个线程去访问共享资源,需要按照一定规则顺序依次去访问,保证共享资源的数据一致性。1.互斥锁互斥相关函数//互斥量pthread_mutex_tmutex;......
  • python基础 - 多线程技术
    基础概念importtimedeftest(something):print(f"我开始>>>{something}")time.sleep(2)print(f"我结束>>>{something}")"""场景:1-io密集型--阻塞sleeprequestssocket"""importthreading"&quo......
  • Quartz的简单使用:实现简单的定时任务
    在Quartz中,你可以定义和调度多个Job。每个Job都有对应的JobDetail和Trigger。1.添加依赖确保你的项目中包含Quartz的依赖。例如,如果你使用的是Maven,可以在pom.xml中添加以下依赖:<dependency><groupId>org.quartz-scheduler</groupId><artifactId>qu......