博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的C#多线程间同步的例子
阅读量:5810 次
发布时间:2019-06-18

本文共 2058 字,大约阅读时间需要 6 分钟。

在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
代码如下:
using
 System;
using
 System.Collections;
using
 System.Collections.Generic;
using
 System.Threading;
///
 
<summary>
///
 在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
///
这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
///
作者:周公
///
 时间:2008-5-17
///
 原发地址:
http://blog.csdn.net/zhoufoxcn
///
 
</summary>
public
 
class
 ThreadDemo
{
    
private
 Thread threadOne;
    
private
 Thread threadTwo;
    
private
 ArrayList stringList;
    
private
 
event
 EventHandler OnNumberClear;
//
数据删除完成引发的事件
    
public
 
static
 
void
 Main()
    {
        ThreadDemo demo 
=
 
new
 ThreadDemo(
1000
);
        demo.Action();
    }
    
public
 ThreadDemo(
int
 number)
    {
        Random random 
=
 
new
 Random(
1000000
);
        stringList 
=
 
new
 ArrayList(number);
        
for
 (
int
 i 
=
 
0
; i 
<
 number; i
++
)
        {
            stringList.Add(random.Next().ToString());
        }
        threadOne 
=
 
new
 Thread(
new
 ThreadStart(Run));
//
两个线程共同做一件事情
        threadTwo 
=
 
new
 Thread(
new
 ThreadStart(Run));
//
两个线程共同做一件事情
        threadOne.Name 
=
 
"
线程1
"
;
        threadTwo.Name 
=
 
"
线程2
"
;
        OnNumberClear 
+=
 
new
 EventHandler(ThreadDemo_OnNumberClear);
        
    }
    
///
 
<summary>
    
///
 开始工作
    
///
 
</summary>
    
public
 
void
 Action()
    {
        threadOne.Start();
        threadTwo.Start();
    }
    
///
 
<summary>
    
///
 共同做的工作
    
///
 
</summary>
    
private
 
void
 Run()
    {
        
string
 stringValue 
=
 
null
;
        
while
 (
true
)
        {
            Monitor.Enter(
this
);
//
锁定,保持同步
            stringValue 
=
 (
string
)stringList[
0
];
            Console.WriteLine(Thread.CurrentThread.Name 
+
 
"
删除了
"
 
+
 stringValue);
            stringList.RemoveAt(
0
);
//
删除ArrayList中的元素
            
if
 (stringList.Count 
==
 
0
)
            {
                OnNumberClear(
this
new
 EventArgs());
//
引发完成事件
            }
            Monitor.Exit(
this
);
//
取消锁定
            Thread.Sleep(
5
);
        }
    }
    
//
执行完成之后,停止所有线程
    
void
 ThreadDemo_OnNumberClear(
object
 sender, EventArgs e)
    {
        Console.WriteLine(
"
执行完了,停止了所有线程的执行。
"
);
        threadTwo.Abort();
        threadOne.Abort();
        
    }
}
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。
本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/162962
 ,如需转载请自行联系原作者
你可能感兴趣的文章
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
[nodejs] nodejs开发个人博客(五)分配数据
查看>>
《Linux内核修炼之道》 之 高效学习Linux内核
查看>>
Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)
查看>>
30分钟Git命令“从入门到放弃”
查看>>
nginx : TCP代理和负载均衡的stream模块
查看>>
MYSQL数据库间同步数据
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
让前端小姐姐愉快地开发表单
查看>>
Dubbo笔记(四)
查看>>
Web前端JQuery入门实战案例
查看>>
java B2B2C Springboot电子商城系统- SSO单点登录之OAuth2.0 登出流程(3)
查看>>
12月26日云栖精选夜读:CDN新品发布:阿里云SCDN安全加速开放公测
查看>>
USB 通信原理
查看>>
7zZip zip RAR iOS
查看>>
date命令的详细用法!
查看>>
分布式存储ceph集群部署
查看>>
UiAutomator源码分析之UiAutomatorBridge框架
查看>>
python 开发之selenium
查看>>