`
yimeng528
  • 浏览: 188749 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第五节:Quzrtz 的 线程池

阅读更多

在说到Quzrtz线程池的时候要先讲一下线程池的概念 :

我个人的理解就是把要执行的东东扔到一个类似水池子的容器里面,给它洗澡,具体怎么洗,洗的干净不干净,还是一个个等着排队洗,都算是线程池对线程的管理,官方的概念也不想找了,就按这样理解吧。

百度上找了下有哪些情况下不使用线程池,感觉挺不错,贴出来看下:

●如果需要使一个任务具有特定优先级

●如果具有可能会长时间运行(并因此阻塞其他任务)的任务

●如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)

●如果需要永久标识来标识和控制线程,比如想使用专用线程来终止该线程,将其挂起或按名称发现它

 

上面说了哪么多,下面来点正题,说说Quzrtz线程池:

Quzrtz的线程池很简单,它只需要实现IThreadPool接口就可以了,Quzrtz中执行任务会用过的线程池有:SimpleThreadPool这个,还有一个算的上没有用的吧:ZeroSizeThreadPool

平常Quzrtz的轮循线程发现有满足条件需要执行的job的时候,就会毫不留情的扔到SimpleThreadPool中洗一澡,下面让我们好好端详一下SimpleThreadPool这个类是如何工作的,先看下类图:

         其中图上的WorkerThread类是SimpleThreadPool类内部包裹的一个类。

 

IThreadRunnable

  这个接口只定义了一个方法:Run(),是执行任务的操作。

  

[csharp] view plaincopy
  1. /// <summary>  
  2.   /// This interface should be implemented by any class whose instances are intended   
  3.   /// to be executed by a thread.  
  4.   /// </summary>  
  5.   public interface IThreadRunnable  
  6.   {  
  7.       /// <summary>  
  8.       /// This method has to be implemented in order that starting of the thread causes the object's   
  9.       /// run method to be called in that separately executing thread.  
  10.       /// </summary>  
  11.       void Run();  
  12.   }  

 

QuartzThread:

  这是个关键的抽象类, WorkerThread就是它的子类,一个该类的实例就相当于一个线程,有自己的名字,有优先级,可以中断执行等。当执行它的Start方法时,就会启动一个线程:

  

[csharp] view plaincopy
  1. /// <summary>  
  2.     /// Support class used to handle threads  
  3.     /// </summary>  
  4.     /// <author>Marko Lahma (.NET)</author>  
  5.     public abstract class QuartzThread : IThreadRunnable  
  6.     {  
  7.         /// <summary>  
  8.         /// The instance of System.Threading.Thread  
  9.         /// </summary>  
  10.         private readonly Thread thread;  
  11.   
  12.         /// <summary>  
  13.         /// Initializes a new instance of the QuartzThread class  
  14.         /// </summary>  
  15.         protected QuartzThread()  
  16.         {  
  17.             thread = new Thread(Run);  
  18.         }  
  19.   
  20.         /// <summary>  
  21.         /// Initializes a new instance of the Thread class.  
  22.         /// </summary>  
  23.         /// <param name="name">The name of the thread</param>  
  24.         protected QuartzThread(string name)  
  25.         {  
  26.             thread = new Thread(Run);  
  27.             Name = name;  
  28.         }  
  29.   
  30.         /// <summary>  
  31.         /// This method has no functionality unless the method is overridden  
  32.         /// </summary>  
  33.         public virtual void Run()  
  34.         {  
  35.         }  
  36.   
  37.         /// <summary>  
  38.         /// Causes the operating system to change the state of the current thread instance to ThreadState.Running  
  39.         /// </summary>  
  40.         public void Start()  
  41.         {  
  42.             thread.Start();  
  43.         }  
  44.   
  45.         /// <summary>  
  46.         /// Interrupts a thread that is in the WaitSleepJoin thread state  
  47.         /// </summary>  
  48.         protected void Interrupt()  
  49.         {  
  50.             thread.Interrupt();  
  51.         }  
  52.   
  53.         /// <summary>  
  54.         /// Gets or sets the name of the thread  
  55.         /// </summary>  
  56.         public string Name  
  57.         {  
  58.             get { return thread.Name; }  
  59.             protected set  
  60.             {  
  61.                 thread.Name = value;  
  62.             }  
  63.         }  
  64.   
  65.         /// <summary>  
  66.         /// Gets or sets a value indicating the scheduling priority of a thread  
  67.         /// </summary>  
  68.         protected ThreadPriority Priority  
  69.         {  
  70.             get { return thread.Priority; }  
  71.             set { thread.Priority = value; }  
  72.         }  
  73.   
  74.         /// <summary>  
  75.         /// Gets or sets a value indicating whether or not a thread is a background thread.  
  76.         /// </summary>  
  77.         protected bool IsBackground  
  78.         {  
  79.             set { thread.IsBackground = value; }  
  80.         }  
  81.   
  82.         /// <summary>  
  83.         /// Blocks the calling thread until a thread terminates  
  84.         /// </summary>  
  85.         public void Join()  
  86.         {  
  87.             thread.Join();  
  88.         }  
  89.   
  90.         /// <summary>  
  91.         /// Obtain a string that represents the current object  
  92.         /// </summary>  
  93.         /// <returns>A string that represents the current object</returns>  
  94.         public override string ToString()  
  95.         {  
  96.             return string.Format(CultureInfo.InvariantCulture, "Thread[{0},{1},]", Name, Priority);  
  97.         }  
  98.     }  

WorkerThread

这个类可以理解也线程池中最小线程单元,一个线程启动的时候,如果用默认配置的话,会初始化十个WorkerThread,像它的父类,它当然是一个线程,它重写了run方法,而且核心代码都写在了这个方法中,如果要读源码的时候,一定要看两眼。代码见源码。

SimpleThreadPool

线程池类,负责对WorkerThread调度管理,比如有一个job来了,它要把这个job分配给哪个空闲的WorkerThread去处理,处理完了,要把这个WorkerThread置成空闲的状态,以便下次继续分配执行job,这里执行的job都需要继承IThreadRunnable接口

 

比如,我现在写一个job 就继承IThreadRunnable,如何让SimpleThreadPool来完成这个job的执行:

 1.如下面自己定义的job

[csharp] view plaincopy
  1. public class JobDemo : IThreadRunnable  
  2.     {  
  3.         public void Run()  
  4.         {  
  5.             Console.WriteLine("JobDemo正在运行,运行时间是" + DateTime.Now + Thread.CurrentThread.Name);  
  6.         }  
  7.     }  

 

2.让简单线程池去执行我的job

 

[csharp] view plaincopy
  1. static void Main(string[] args)  
  2.         {  
  3.             //实例化我要执行的job  
  4.             JobDemo demo = new JobDemo();  
  5.   
  6.             //实例线程池,线程数为10  
  7.             SimpleThreadPool simpleThreadPool = new SimpleThreadPool(10, ThreadPriority.Normal);  
  8.             //初始化线程池,这步必须要有  
  9.             simpleThreadPool.Initialize();  
  10.   
  11.             //如果有空闲的线程,就执行任务.  
  12.             //如果simpleThreadPool.BlockForAvailableThreads()内部没有可用的线程时,会处于阻塞状态  
  13.             //理论上simpleThreadPool.BlockForAvailableThreads() > 0 永远为true  
  14.             while (simpleThreadPool.BlockForAvailableThreads() > 0)  
  15.             {  
  16.                 simpleThreadPool.RunInThread(demo);  
  17.                 Thread.Sleep(500);  
  18.             }  
  19.   
  20.             Console.Read();  
  21.   
  22.             //干掉所有的线程  
  23.             simpleThreadPool.Shutdown();  
  24.         }  

 

3.结果:

 

整个代码,已经从Quartz中剥离出来,下载点我

http://download.csdn.net/detail/wanggang421338916/4190504

分享到:
评论

相关推荐

    quzrtz页面管理

    5. **监控与管理**:"quzrtz页面管理"着重于提供一个可视化界面,用于监控任务的执行情况,如任务状态(等待、运行、完成、失败)、触发器信息、执行日志等。用户可以在这个界面中启动、停止、暂停或恢复任务,也...

    Scheduler quzrtz-2.2.2.zip

    5. **启动Scheduler**:调用`Scheduler`的`start`方法开始调度。 6. **管理任务**:可以随时添加、更新或删除Job和Trigger,以及暂停、恢复或删除已调度的任务。 Quartz的灵活性和强大功能使其成为许多企业级应用的...

    Spring整合quzrtz

    集成Quartz到Spring项目中的第一步通常是引入依赖。在描述中提到的“最少依赖的jar包”,通常包括Spring的核心库、Quartz的库以及可能需要的数据库驱动(如果计划使用数据库存储Job和Trigger信息)。这些jar包应该在...

    springboot-quartz 单机demo,分布式下demo

    cronExpression: "0/5 * * * * ?" # 每5秒执行一次 ``` 以上配置完成后,SpringBoot启动时会自动初始化Quartz Scheduler并根据配置执行任务。 接下来,我们转向**分布式环境下的SpringBoot-Quartz应用**。在...

    Quartz作业调度框架

    通过对Quartz源码的学习,我们可以深入理解其内部设计,包括线程池管理、调度算法、持久化机制等,这对于优化和自定义Quartz的行为非常有帮助。在实际项目中,合理利用Quartz可以极大地提升系统自动化处理的能力,...

    quartz-2.2.3-官方文档数据及PDM表结构.zip

    5. **集群(Clustering)**:Quartz支持集群,这意味着可以在多台服务器上部署相同的调度器实例,以实现高可用性和故障转移。当一个节点失败时,其他节点会接管其任务。 6. **插件(Plugins)**:Quartz提供了多种...

    项目预警模块 定时任务quzrtz的增删改查操作

    在IT行业中,任务调度是一个关键的部分,特别是在大型项目中,以确保特定任务按照预定的时间自动执行。本项目涉及的是一个名为“项目预警模块”的功能,它利用了quartz这一强大的任务调度框架进行定时任务的管理。...

    Quartz 最新2.2.3版本所有jar包

    它支持简单定时(如每5分钟执行一次)以及复杂表达式(如Cron表达式),使得开发者能够精确控制任务的执行时间。Cron表达式允许你基于特定的时间模式(如小时、分钟、日期等)来设定任务的触发时间。 其次,Quartz ...

    springboot+mybatis+quartz

    2. **Quartz配置**:在Quartz配置中,我们可以设置线程池大小、调度器名称等参数,并定义作业和触发器。Quartz支持Cron表达式,可以方便地设定任务执行的时间规则。 3. **任务模型设计**:定义Job类,继承自`org....

    spring-batch+quartz处理mysql数据示例

    5. **ItemProcessor**: 对读取到的Item进行业务逻辑处理。 6. **ItemWriter**: 将处理后的Item写入目标数据源。 在本示例中,Spring Batch 被用来从MySQL数据库读取数据,然后对数据进行处理,最后将处理结果写回到...

    Quartz如何从入门到精通.pdf

    Quartz框架只需要少数的第三方库,并且这些三方库是必需的,你很可能已经在使用这些库了。 Quartz框架的配置文件quartz.properties文件是Quartz框架的核心配置文件,它包括了Quartz框架的所有配置信息。你可以通过...

    quartz 持久化数据库表结构sql

    5. QRTZ_BLOB_TRIGGERS:用于存储Blob类型的Job数据。 6. QRTZ_TRIGGER_LISTENERS:记录Trigger监听器信息。 7. QRTZ_JOB_LISTENERS:记录Job监听器信息。 8. QRTZ_CALENDARS:存储日历信息,用于排除特定日期。 9. ...

    postgres-quartz.sql

    postgres quatrz初始化sql脚本文件、pg、quartz、qrtz_开头的表 配置文件需求修改 #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore....

    quartz介绍.ppt

    quartz介绍.ppt, quzrtz 的开发

    Quartz定时任务常用的11张数据库脚本表结构

    5. **QRTZ_BLOB_TRIGGERS**:如果Trigger包含二进制大对象(Blob)数据,比如Job的数据映射,那么这些信息将存储在这个表中。`BLOB_DATA`字段用于存储Blob数据。 6. **QRTZ_TRIGGER_LISTENERS**:这个表用于跟踪...

    java spring boot springboot 后台管理框架源码程序 源代码(内含部署文档及数据库)

    此项目源码采用spring boot开发,使用springsecurity进行权限控制。前后端基于json进行交互,接口通过JWT无状态token进行权限校验,使用redis或者数据库进行token缓存,接口完全采用Restful的风格,实现按钮级权限...

Global site tag (gtag.js) - Google Analytics