基于windows多线程开发的任务执行队列设计实现实例

之前写在其他地方,转移到csdn来。

只需要生成一个任务队列执行者,并启动,就可以不断的往里面添加任务,自动在后台执行任务。而且可以方便的终止所有任务。本程序只是演示任务队列的实现方式,具体应用到项目可以根据实际情况修改。实现自己的任务类。添加自己的参数。


本站原创,谢绝转载。

#include "stdafx.h"
#include <iostream>
#include <vector>

#include <Windows.h>

class MyMutex
{
public:
        MyMutex() { InitializeCriticalSection(&m_mutexLock); }
        ~MyMutex() { DeleteCriticalSection(&m_mutexLock);  }

public:
        void  Lock(void) { EnterCriticalSection(&m_mutexLock); }
        void  Unlock(void) { LeaveCriticalSection(&m_mutexLock); }

private:
        CRITICAL_SECTION  m_mutexLock;
};




//所有任务的基类
class ITaskEvent
{
public:
        virtual ~ITaskEvent() { };

        virtual void execute() = 0;
        virtual void stop() = 0;
};

//模拟任务类1
class TaskClass1 : public ITaskEvent
{
public:
        TaskClass1(){m_isStop = false;};
        virtual ~TaskClass1(){};

        virtual void execute(){ 

                int i= 0;
                while (!m_isStop && i<10)
                {
                        Sleep(100);
                        std::cout<<"\nthis is task class 1 execute...";
                        i++;
                }
                
        };
        //终止任务
        virtual void stop(){
                m_isStop = true;
        };

private:
        boolean m_isStop;


};

//模拟任务类2
class TaskClass2 : public ITaskEvent
{
public:
        TaskClass2(){m_isStop = false;};
        virtual ~TaskClass2(){};

        virtual void execute()
        {
                int i= 0;
                while (!m_isStop && i<10)
                {
                        Sleep(100);
                        std::cout<<"\nthis is task class 2 execute...";
                        i++;
                }
        };
        //终止任务
        virtual void stop()
        {
                m_isStop = true;
        }

private:
    boolean m_isStop;

};




//执行所有任务的线程类
class TasksThread
{

        //所有的任务列表
        typedef std::vector<ITaskEvent * >        ListTaskEvent;
        

public:
        TasksThread()
        {
        };
        virtual ~TasksThread()
        {
                stop();
        };

        static DWORD WINAPI  ThreadFunc(LPVOID p)

        {
                if (p != NULL)
                {
                        TasksThread *pThis = (TasksThread *)p;
                        pThis->thread_run();
                }
                return 0;
        }

        //向线程中添加一个任务
        void   post_task(ITaskEvent * task){
                myMutex.Lock();        
                m_lstTaskEvents.push_back(task);
                myMutex.Unlock();
        };

        //开始创建线程,执行任务
        unsigned int start()
        {
                m_stop_flag = false;
                hThread = ::CreateThread(NULL, NULL, TasksThread::ThreadFunc, this, 0, &threadId);
                return 0;
        }

        


        //先停止任务,等待指定的时间,INFINITE等其自行结束
        void join(unsigned long millseconds)
        {
                stop();
                if (hThread != NULL)
                {
                        WaitForSingleObject(hThread, millseconds);
                        //TerminateThread(hThread, DEF_EXIT_CODE);//强制中止它,容易出问题
                        CloseHandle(hThread);
                }
                
        }



        //线程的执行方法
        unsigned int thread_run()
        {
                
                while (!this->m_stop_flag)
                {
                        process_tasks();
                        Sleep(10);
                        
                }
                return 0;
        };

private:
        //执行任务队列里面的任务
        void        process_tasks()
        {
                std::vector<ITaskEvent * > lst;
                {
                        myMutex.Lock();
                        m_lstTaskEvents.swap(lst);
                        myMutex.Unlock();
                }

                std::vector<ITaskEvent * >::iterator  vit = lst.begin();
                for (; vit != lst.end(); vit ++)
                {
                        if (m_stop_flag)
                        {
                                (*vit)->stop();
                                delete (*vit);                
                                continue;
                        }
                        else
                        {
                                        
                                (*vit)->execute();
                                delete (*vit);        
                        }                
                        
                }
        };

        //停止执行任务,异步停止
        void stop()
        {
                this->m_stop_flag = true;
        }

private:
        HANDLE  hThread;
        DWORD  threadId;
        ListTaskEvent               m_lstTaskEvents;
        //终止标志
        boolean m_stop_flag;
        MyMutex myMutex;
};

int _tmain(int argc, _TCHAR* argv[])
{

        //创建一个任务队列执行者,开始后,可以不断的按顺序执行加入其中的任务
        TasksThread taskThread;

        //创建几个任务
        TaskClass1 *t1 = new TaskClass1();
        TaskClass2 *t2 = new TaskClass2();

        taskThread.post_task(t1);//加入任务
        taskThread.post_task(t2);//加入任务

        //开始执行
        taskThread.start();

        //中途再加入任务
        taskThread.post_task(new TaskClass1());

        
        int a;
        std::cin>>a;
        while (a != 0)
        {
                taskThread.post_task(new TaskClass2());//测试不断的加入新的任务
                std::cin>>a;

        }


        taskThread.join(INFINITE);//发终止命令后,一直等待到它结束
        //taskThread.join(100);//发终止命令后,等待100毫秒,让其自行结束

        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Java 多线程队列实例,模拟队列实现排队叫号的过程: ```java import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class QueueExample { private Queue<Integer> queue = new LinkedList<>(); private Lock lock = new ReentrantLock(); private int currentTicketNumber = 0; public void addCustomer() { lock.lock(); try { queue.offer(currentTicketNumber++); System.out.println("新顾客取得号码:" + (currentTicketNumber - 1) + ",当前队列长度:" + queue.size()); } finally { lock.unlock(); } } public void serveCustomer() { lock.lock(); try { Integer ticketNumber = queue.poll(); if (ticketNumber == null) { System.out.println("队列为空,无法叫号"); } else { System.out.println("叫到号码:" + ticketNumber + ",当前队列长度:" + queue.size()); } } finally { lock.unlock(); } } public static void main(String[] args) { final QueueExample queueExample = new QueueExample(); // 开启 5 个线程模拟 5 个顾客取号 for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { queueExample.addCustomer(); } }).start(); } // 开启 3 个线程模拟 3 个服务员叫号 for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { queueExample.serveCustomer(); } }).start(); } } } ``` 这个例子中,我们定义了一个 `QueueExample` 类,其中有一个 `queue` 队列,用于存储所有顾客的票号。我们使用 `ReentrantLock` 类来实现线程安全。在 `addCustomer` 方法中,我们通过 `offer` 方法往队列中添加一个顾客的票号,并输出当前队列长度以及新顾客的票号。在 `serveCustomer` 方法中,我们通过 `poll` 方法从队列中获取一个顾客的票号,并输出当前队列长度以及叫到的顾客的票号。 在 `main` 方法中,我们开启了 5 个线程模拟 5 个顾客取号,以及 3 个线程模拟 3 个服务员叫号。你可以运行这个例子来看一下具体的输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值