您的位置:首页 > 其它

QuartZ的线程锁

2015-09-08 22:06 369 查看
1. 自定义QuartZ的并发锁
using System;
using System.Threading;
using log4net;
using Quartz;

namespace HK.Gramma.Business
{
public class FirstTimeJob : IJob
{
/// <summary>
///     日志工具
/// </summary>
private static readonly ILog Logger = LogManager.GetLogger("FirstTimeJob");

/// <summary>
///     线程对象
/// </summary>
private static readonly object SyncObj = new object();

/// <summary>
///     任务运行标识
/// </summary>
private static bool _isRunning;

/// <summary>
///     线程访问计数
/// </summary>
private static int _visitCount = 0;

/// <summary>
///     执行定时任务
/// </summary>
/// <param name="context">上下文</param>
public void Execute(IJobExecutionContext context)
{
lock (SyncObj)
{
if (_isRunning)
{
return;
}

_isRunning = true;
}

try
{
Logger.InfoFormat("开始任务,线程ID={0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
_visitCount++;
Logger.InfoFormat("结束任务,线程ID={0},访问总数={1}", Thread.CurrentThread.ManagedThreadId, _visitCount);            }
catch (Exception ex)
{
Logger.ErrorFormat("任务异常\r\n{0}", ex);
}
finally
{
lock (SyncObj)
{
_isRunning = false;
}
}
}
}
}
2. 使用QuartZ. DisallowConcurrentExecutionAttribute 可以简化并发锁的处理。
using System;
using System.Threading;
using log4net;
using Quartz;

namespace HK.Gramma.Business
{
[DisallowConcurrentExecution]
public class SecondTimeJob : IJob
{
/// <summary>
///     线程访问计数
/// </summary>
private static int _visitCount = 0;

/// <summary>
///     日志工具
/// </summary>
private static readonly ILog Logger = LogManager.GetLogger("SecondTimeJob");

/// <summary>
///     执行定时任务
/// </summary>
/// <param name="context">上下文</param>
public void Execute(IJobExecutionContext context)
{
try
{
Logger.InfoFormat("开始任务,线程ID={0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
_visitCount++;
Logger.InfoFormat("结束任务,线程ID={0},访问总数={1}", Thread.CurrentThread.ManagedThreadId, _visitCount);
}
catch (Exception ex)
{
Logger.ErrorFormat("任务异常\r\n{0}", ex);
}
}
}
}
测试结果如下
2015-09-08 20:42:30,001 [ServiceScheduler_Worker-2] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=4
2015-09-08 20:42:35,001 [ServiceScheduler_Worker-2] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=4,访问总数=1
2015-09-08 20:42:35,001 [ServiceScheduler_Worker-6] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=8
2015-09-08 20:42:40,002 [ServiceScheduler_Worker-6] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=8,访问总数=2
2015-09-08 20:42:40,002 [ServiceScheduler_Worker-9] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=11
2015-09-08 20:42:45,003 [ServiceScheduler_Worker-9] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=11,访问总数=3
2015-09-08 20:42:45,003 [ServiceScheduler_Worker-4] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=6
2015-09-08 20:42:50,004 [ServiceScheduler_Worker-4] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=6,访问总数=4
2015-09-08 20:42:50,004 [ServiceScheduler_Worker-7] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=9
2015-09-08 20:42:55,004 [ServiceScheduler_Worker-7] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=9,访问总数=5
2015-09-08 20:42:55,005 [ServiceScheduler_Worker-1] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=3
2015-09-08 20:43:00,006 [ServiceScheduler_Worker-1] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=3,访问总数=6
2015-09-08 20:43:00,007 [ServiceScheduler_Worker-5] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=7
2015-09-08 20:43:05,007 [ServiceScheduler_Worker-5] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=7,访问总数=7
2015-09-08 20:43:05,007 [ServiceScheduler_Worker-6] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=8
2015-09-08 20:43:10,008 [ServiceScheduler_Worker-6] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=8,访问总数=8
2015-09-08 20:43:10,012 [ServiceScheduler_Worker-3] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=5
2015-09-08 20:43:15,012 [ServiceScheduler_Worker-3] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=5,访问总数=9
2015-09-08 20:43:15,012 [ServiceScheduler_Worker-4] INFO  SecondTimeJob [(null)] - 开始任务,线程ID=6
2015-09-08 20:43:20,013 [ServiceScheduler_Worker-4] INFO  SecondTimeJob [(null)] - 结束任务,线程ID=6,访问总数=10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 quartz 并发