最近需要解决一个多线程问题,将这个问题抽象说来就是这个情况。
有A B两个方法同时完成F工作,A B操作均比较耗时,且 B操作需要A操作完成后才能执行。
现 要 A 和B同时运行n个线程。
用数学化的语言描述一下
/***************************
* 现有线程 A1,A2……Ai……Ak
* 线程B1,B2,B3……Bi……Bk
* Ai和Bi需要顺序执行,共同完成F操作
* Ai和Bi+1之间无干扰
* Bi和Bi+1之间无干扰
* Ai和Bi+1之间无干扰
* A B操作都比较耗时
************************/
最初在思考解决方案的时候,想的是 为每一A设置一个标记位,去记录 当前的Ai所处的状态,然后再Bi中去循环访问Ai的该标记,如果标记表示可执行Bi,则跳出循环,执行Bi操作。
想来这种方案应该也能实现,但又想到C#提供的Join方法,刚好就是解决t2线程运行前需要等待t1完成的问题而给出的,恰好可以利用,处理起来应该会更简单,更安全。
Join方法是指将指定的线程合并到当前线程中,最初学的时候很不清楚这个合并是什么意思,现在看来应该就是 类似与在 原有的t2一块木板(当前线程)上的某个位置出 拼上 t1木板(指定线程),这样,运行t2木板是,合并上的t1那一块也就成为了必经的路程。
Join方法还提供了Join的时间,以免 t1操作过久,导致一直等待下去。如 t2.Join(100);
考虑上面的问题,由于 Ai和Bi 之间才有同步关系,所以 需要处理就是这一个对应,Join的时候只要找到Bi对应的Ai线程即可
故,我为在整个类中保存两个了静态的 字典 Dictionary<int,Thread> 前一个 表示该线程的索引,=后一个表示该线程本身
源代码如下: