线程----Monitor类设置超时值

Monitor类与Lock语句相比,Monitor类的主要优点是:可以添加一个等待被锁定的超时值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            ShareClass sc = new ShareClass();
            Job j=new Job (sc);
            Task[] ts=new  Task[20];
            for (int i = 0; i < 20; i++)
            {
                ts[i] = new Task(j.TheDoJob2);
                ts[i].Start();
            }
            for (int i = 0; i < 20; i++)
            {
                ts[i].Wait();
            }
            Console.WriteLine(sc.state);
            Console.ReadKey();
        }
     
    }
    class ShareClass
    {
        public int state { get; set; }
    }
    class Job
    {
        ShareClass sc { get; set; }
        private object obj = new object();
        public Job(ShareClass s)
        {
            sc = s;
        }
        //==========普通的Monitor类
        public void TheDoJob()
        {
            //锁定
            Monitor.Enter(obj);
            try
            {
                for (int i = 0; i < 10000; i++)
                {
                    sc.state++;
                }
            }
            catch { }
            finally
            {
                //如果抛出异常也会就出锁
                //释放锁
                Monitor.Exit(obj); 
            }
        }
 
        //===========给Monitor类设置超时时间
        public void TheDoJob2()
        {
            bool yesno=false;
            //锁定
            Monitor.TryEnter(obj, 100, ref yesno);
            if (yesno)
            {
                for (int i = 0; i < 10000; i++)
                {
                    sc.state++;
                }
                Console.WriteLine("yes");
                //释放锁
                Monitor.Exit(obj);
            }
            else
            {
                //如果超时会执行下面代码
                Console.WriteLine("no");
            }
        }
    }
}

TheDoJob()

TheDoJob2()

时间: 2024-11-02 23:34:09

线程----Monitor类设置超时值的相关文章

C#多线程开发7:使用Monitor类同步多个线程

在<使用lock语句同步多个线程>的文章中,使用lock语句同步多线程访问临界资源. 使用lock语句的代码如下所示. private static object o = new object(); lock (o) { if (account >= 1000) { Thread.Sleep(10);//自动取款机打了个小盹 account -= 1000; pocket += 1000; } } 使用ILDASM工具查看上面代码对应的IL代码: 可以发现:lock语句被解析为调用Mon

线程基础四 使用Monitor类锁定资源

前面我们讲过了lock的用法以及竞争条件导致的错误,实际上lock关键字是Monitor类用例的一个语法糖.如果我们分解使用了lock关键字的代码,将会看到它如下面代码片段所示: bool acquireLock = false; try { Monitor.Enter(lockObject, ref acquireLock); //Code that access resources that are protected by the lock. } finally { if (acquire

C#WinForm线程基类

在CS模式开发中一般我们需要用到大量的线程来处理比较耗时的操作,以防止界面假死带来不好的体验效果,下面我将我定义的线程基类给大家参考下,如有问题欢迎指正. 基类代码 1 #region 方法有返回值 2 /// <summary> 3 /// 功能描述:多线程执行方法,方法有返回值 4 /// 作 者:huangzh 5 /// 创建日期:2017-03-29 17:44:26 6 /// 任务编号:MES 7 /// </summary> 8 /// <param name

命名空间System.Threading命名空间的同步锁 Monitor类

官方备注: Monitor类通过向单个线程授予对象所来控制对对象的访问.对象所提供限制访问代码块的能力.当一个线程拥有对象的锁时,其他任何线程都不能获取该锁.还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码,除非另一个线程正在使用其他的锁定对象执行改代码. Monitor类调用Enter或TryEnter方法获取对象锁,使用Exit放弃对象锁,在Enter/TryEnter和Exit之间可调用Pause/PauseAll或Wait方法,Wait方法的调用会

C++进阶学习——线程基类的设计(Linux)

此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下: ThreadBase.cpp, ThreadBase.h为线程基类 ThreadDerive.cpp, ThreadDerive.h为测试派生类 main.cpp为测试程序 ThreadBase.h内容如下: #ifndef __THREADBASE_H__ #define __THREADBASE_H__ #include <pthread.h> //线程基类 class ThreadBase { publ

C#使用Monitor类、Lock和Mutex类进行多线程同步

在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁,好在Framework中已经为我们提供了三个加锁的机制,分别是Monitor类.Lock关键字和Mutex类. 其中Lock关键词用法比较简单,Monitor类和Lock的用法差不多.这两个都是锁定数据或是锁定被调用的函数.而Mutex则多用于锁定多线程间的同步调用.简单的说,Monitor和Loc

ThreadPoolExecutor线程池参数设置技巧

一.ThreadPoolExecutor的重要参数   corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 queueCapacity:任务队列容量(阻塞队列) 当核心线程数达到最大时,新任务会放在队列中排队等待执行 maxPoolSize:最大线程数 当线程数>=corePoolSize,且任务队

线程 ManualResetEvent 类

Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态.此线程可被视为控制 ManualResetEvent. 为了把状态修改为无信号的,必须调用ReSet()方法. WaitOne(): 调用ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号. Set ()当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号.并释放所有等待线程.Set将事件状

C# Monitor类的使用

C#中, 通过System.Threading.Monitor类可以实现多线程中对某些代码块的同步访问,以确保数据的安全性. object obj=new object(); Monitor在锁对象obj上会维持两个线程队列R和W以及一个引用T : (1) T是对当前获得了obj锁的线程的引用(设此线程为CurrThread); (2) R为就绪队列, 其上的线程已经准备好获取obj锁.当obj锁被CurrThread释放后(CurrThread可通过Monitor.Exit(obj)或 Mon