多线程、多任务管理 简单demo

需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);

多个任务 根据条件不同 可能需要不同的处理

分析: 多线程并发执行多任务;

对任务进行管理,追踪中间执行状态;

运用策略模式抽象执行类;

实现:

 1 public enum TaskStatus
 2     {
 3         wait = 0,
 4         working = 1,
 5         stop = 2,
 6         suspend = 3,
 7         complete = 4,
 8         fail = 5,
 9         other = 99
10     }

TaskStatus

  1 public class Task
  2     {
  3         public TaskDelegate<ParaStatus> taskStatus;
  4         public TaskDelegate<ParaInfo> taskInfo;
  5         public TaskDelegate<ParaProcess> taskProcess;
  6
  7         private TaskStatus _status = TaskStatus.wait;
  8         private IExecuter _Executer { get; set; }
  9         private Guid _taskId;
 10         private Thread thread;
 11         private string _name;
 12
 13         public Task(Guid id, IExecuter Executer)
 14         {
 15             _taskId = id;
 16             _Executer = Executer;
 17             _Executer.TaskId = id;
 18             _Executer.Task = this;
 19         }
 20
 21         public void Wait()
 22         {
 23             ChangeStatus(TaskStatus.wait);
 24         }
 25
 26         public string Name
 27         {
 28             get
 29             {
 30                 return _name;
 31             }
 32             set
 33             {
 34                 _name = value;
 35             }
 36         }
 37
 38         public Guid TaskId
 39         {
 40             get
 41             {
 42                 return _taskId;
 43             }
 44         }
 45
 46         public TaskStatus Status
 47         {
 48             get
 49             {
 50                 return _status;
 51             }
 52             set
 53             {
 54                 _status = value;
 55             }
 56         }
 57
 58         public void Start()
 59         {
 60             if (thread == null)
 61             {
 62                 thread = new Thread(_Executer.Do);
 63             }
 64             else if (thread.ThreadState == ThreadState.Stopped)
 65             {
 66                 thread = new Thread(_Executer.Do);
 67             }
 68             thread.Start();
 69             ChangeStatus(TaskStatus.working);
 70         }
 71         public void ChangeStatus(TaskStatus s)
 72         {
 73             Status = s;
 74             ParaStatus ps = new ParaStatus(TaskId);
 75             ps.Status = Status;
 76             if (taskStatus != null) taskStatus(ps);
 77         }
 78         public void Stop()
 79         {
 80             if (thread != null)
 81             {
 82                 if (thread.IsAlive)
 83                 {
 84                     try
 85                     {
 86                         thread.Abort();
 87                     }
 88                     catch { }
 89                 }
 90             }
 91             ChangeStatus(TaskStatus.stop);
 92         }
 93         public void Suspend()
 94         {
 95             try
 96             {
 97                 thread.Suspend();
 98             }
 99             catch { }
100             ChangeStatus(TaskStatus.suspend);
101         }
102         public void Resume()
103         {
104             if (thread.IsAlive)
105             {
106                 thread.Resume();
107             }
108             ChangeStatus(TaskStatus.working);
109         }
110     }

Task

1  public interface IExecuter
2     {
3         Guid TaskId { get; set; }
4
5         Task Task { get; set; }
6         void Do();
7     }

IExecuter

 1 public class Executer : IExecuter
 2     {
 3         public void Execute()
 4         {
 5
 6         }
 7         #region IExecute
 8         public Guid TaskId { get; set; }
 9
10         public Task Task { get; set; }
11
12         public void Do()
13         {
14             for (int i = 1; i <= 100; i++)
15             {
16                 if (Task.taskProcess != null)
17                 {
18                     Thread.Sleep(1000);
19                     ParaProcess pp = new ParaProcess(TaskId);
20                     pp.Rate = (double)i / 100;
21                     Task.taskProcess(pp);
22                 }
23             }
24             if (Task.taskStatus != null)
25             {
26                 Task.ChangeStatus(TaskStatus.complete);
27             }
28         }
29         #endregion
30     }

Executer

 1 public class TaskManager
 2     {
 3         public List<Task> Tasks = new List<Task>();
 4         /// <summary>
 5         /// 添加任务
 6         /// </summary>
 7         public Task AddTask(Task task)
 8         {
 9             try
10             {
11                 Tasks.Add(task);
12
13                 task.Wait();
14             }
15             catch (Exception e)
16             {
17
18             }
19             return task;
20         }
21         public void StartTask(Task task)
22         {
23             task.Start();
24         }
25         /// <summary>
26         /// 停止任务
27         /// </summary>
28         /// <param name="downloader"></param>
29         public void StopTask(Task task)
30         {
31             task.Stop();
32         }
33
34         public void SuspendTask(Task task)
35         {
36             task.Suspend();
37         }
38
39         public void ResumeTask(Task task)
40         {
41             task.Resume();
42         }
43
44         /// <summary>
45         /// 删除任务(自动终止未停止的任务)
46         /// </summary>
47         /// <param name="downloader"></param>
48         public void DeleteTask(Task task, bool deleteFile)
49         {
50             //先停止任务
51             task.Stop();
52
53             while (task.Status == TaskStatus.working)
54             {
55                 Thread.Sleep(50);
56             }
57
58             //从任务列表中删除任务
59             if (Tasks.Contains(task))
60             {
61                 Tasks.Remove(task);
62             }
63         }
64
65     }

TaskManager

 1  /// </summary>
 2     /// <param name="para">泛型参数</param>
 3     public delegate void TaskDelegate<T>(T para);
 4
 5     /// <summary>
 6     ///
 7     /// </summary>
 8     public class ParaStatus
 9     {
10         public ParaStatus(Guid task) { TaskId = task; }
11         public Guid TaskId { get; set; }
12         public TaskStatus Status { get; set; }
13     }
14
15     public class ParaInfo
16     {
17         public ParaInfo(Guid task) { TaskId = task; }
18         public Guid TaskId { get; set; }
19         public string Info { get; set; }
20     }
21
22     public class ParaProcess
23     {
24         public ParaProcess(Guid task) { TaskId = task; }
25         public Guid TaskId { get; set; }
26         public double Rate { get; set; }
27     }

TaskDelegate

demo 下载:demo

时间: 2024-10-20 20:23:29

多线程、多任务管理 简单demo的相关文章

C#多线程最简单Demo

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace testThread { class ThreadingExample { static void DoWork() { int i; for (i = 100; i >= 0; i--) { Console.WriteLine(i); } } static

Java 多线程IO简单实用Demo

多线程主要作用是充分利用Cpu,而不在于它的乱序性.本Demo不讲它竞争什么的.之前看过乱序打印ABC的例子什么的,那些有意义吗? 本Demo 是多线程打印文件夹下的文件,主要实现是用数组存放文件,一个游标遍历. 我们需要考虑在什么时候加互斥访问,本例用synchronized . 先考虑单线程的流程:客户端启动-->读取文件下的文件放到数组(IO)--> 取游标打印 ,游标加1 -- > 改文件写文件(IO) -- 重复上两步至越界 -- 结束 多线程时显然需要在"取游标打印

Cr多线程编程简单实例

国家using System; using System.Collections;using System.Collections.Generic;using System.Threading; /// <summary>/// 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行.在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作.//////这个程序的思路是共同做一件事情(从一个Ar

Ext简单demo示例

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <titl

gdb调试多线程的简单命令

由于平时的编程当中经常会用到多线程,我想接触过多线程编程的人应该都会清楚多线程如果出了错,调起bug来是有多么麻烦,应为你某个地方出错了,有可能并不是这里的问题而是线程执行到这就切换到其他线程,而出错的是其他线程,我以前使用的办法是给某个线程sleep然后让内核自己调度去执行其他线程.很明显这种方法当有很多线程是并不是很使用,所以我就翻书学了几条调试多线程的简单gdb命令 1.测试所用的代码 1void *thread1(void *arg) 2{ 3 printf("New thread1\n

Unity3d 背景、音效 播放 简单demo

仅实现功能,AudioListener在MainCamera中 using UnityEngine; using System.Collections; using System.Collections.Generic; public class MusicManger : MonoBehaviour { AudioSource _backMusicSource = null; AudioSource _SoundSource = null; //public string musicName

Android SQLite最简单demo实现(增删查改)

本来不太想写这篇博客的,但是看到网上的关于android数据库操作的博文都讲得很详细,对于像我这样的新手入门了解SQLite的基本操作有一定难度,所以我参考了网上的一些博客文章,并自己亲自摸索了一遍,希望写出这么一篇博文来记录SQLite的最基本操作,同时也希望能够对android的新手们有些帮助. 参考博客:http://www.20864.com/201247/274.html 这里只是一个示范性的demo,并没实现什么具体功能,只实现了对数据库的增删查改操作. 以下是实现demo的步骤:

FORM验证简单demo

详解稍后加入. 项目结构如图: web.xml <?xml version="1.0" encoding="UTF-8" ?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

Java多线程之简单的线程同步实例

数据类: package Thread.MyCommon; public class Data { public int num = 0; public synchronized int getEven() { ++num; Thread.yield();//让另外线程先执行,加大测试效果几率 ++num; return num; } } 线程类: package Thread.MyCommon; public class myThread implements Runnable { priva