小弟正在做一个系统,其中包含一个类如下:
class 学生
{
     string 学号;
     string  费用;
    
     public void 计费(学号,费用)
     {
         费用减去某值;
         Thread.sleep(一定时间间隔);   
     }
}程序在一定的条件下要创建一个学生的实例,传递学号和他的费用,要求按某时间间隔前去一定的费用,这个容易实现,new Thread(new ThreadStart(计费));就可以了吧,可是,如果我在另外一种情况下,需要再此传人这个学生的学号,根据该学号中止对这位同学的计费过程,我要如何抓到这个线程呢?我是这样想的,定义包含一个静态ArrayList(或者数组)的类,每当我发生计费情况时,我先把学号加进这个列表中(Add),发生取消计费情况时,从列表中删除该学号,然后Studentx.计费()方法中,我加上一条对这个ArrayList的扫描,如果还在,那我计费继续,如果该学号被删除,就跳出while{}.
我自己觉得这个算法有问题,就是我有三中语句在访问这个ArrayList:Add() remove()计费()
如果需要计费的学生很多,需要很多线程,同时又有很多add()和remove(),即使加了共享锁和互斥锁,我还是担心系统会有问题,同时我决定这个算法也不高效,不知道各位平时是怎么解决这种监控问题的???拜请指教!!!!!!!

解决方案 »

  1.   

    1、创建计费类,将计费方法转移到其中
    2、将ArrayList换成Queue,Queue是线程安全的,不需要加锁
    3、将要计费的学生加入Queue,不需要计费的学生新建SortedList保存(不计费的学生应该不多,采用SortedList可以快速定位),SortedList是否线程安全不清楚,请查阅相关资料(很久没写代码,手生了)
    4、开辟thread从Queue中依次取出学生,到SortedList中比对计费与否,如需计费开辟新的thread计费,建议用异步操作取代计费thread