在开发中经常会遇到线程例子如果某个后台操作比较费时间我们就可以启动个线程去执行那个费时操作同时继续执行在某些情况下可能会出现多个线程同步协同问题下面例子就展示了在两个线程的间如何协同工作
这个思路是共同做件事情(从个ArrayList中删除元素),如果执行完成了两个线程都停止执行
代码如下:
using;
using.Collections;
using.Collections.Generic;
using.Threading;
///<summary>
///在开发中经常会遇到线程例子如果某个后台操作比较费时间我们就可以启动个线程去执行那个费时操作同时继续执行在某些情况下可能会出现多个线程同步协同问题下面例子就展示了在两个线程的间如何协同工作
///
///这个思路是共同做件事情(从个ArrayList中删除元素),如果执行完成了两个线程都停止执行
///作者:周公
///时间:2008-5-17
///原发地址:http://blog.csdn.net/zhoufoxcn
///</summary>
publicThreadDemo
{
privateThreadthreadOne;
privateThreadthreadTwo;
privateArrayListList;
privateeventEventHandlerOnNumberClear;//数据删除完成引发事件
publicvoidMain
{
ThreadDemodemo=ThreadDemo(1000);
demo.Action;
}
publicThreadDemo(number)
{
Randomrandom=Random(1000000);
List=ArrayList(number);
for(i=0;i<number;i)
{
List.Add(random.Next.);
}
threadOne=Thread(ThreadStart(Run));//两个线程共同做件事情
threadTwo=Thread(ThreadStart(Run));//两个线程共同做件事情
threadOne.Name="线程1";
threadTwo.Name="线程2";
OnNumberClearEventHandler(ThreadDemo_OnNumberClear);
}
///<summary>
///开始工作
///</summary>
publicvoidAction
{
threadOne.Start;
threadTwo.Start;
}
///<summary>
///共同做工作
///</summary>
privatevoidRun
{
Value=null;
while(true)
{
Monitor.Enter(this);//锁定保持同步
Value=()List[0];
Console.WriteLine(Thread.CurrentThread.Name+"删除了"+Value);
List.RemoveAt(0);//删除ArrayList中元素
(List.Count0)
{
OnNumberClear(this,EventArgs);//引发完成事件
}
Monitor.Exit(this);//取消锁定
Thread.Sleep(5);
}
}
//执行完成的后停止所有线程
voidThreadDemo_OnNumberClear(objectsender,EventArgse)
{
Console.WriteLine("执行完了停止了所有线程执行");
threadTwo.Abort;
threadOne.Abort;
}
}
介绍说明:要实现线程同步不止这种方式在这里采用了事件在事件处理里中止了线程(主要是回答csdn论坛个朋友问题才用了这种办法)
这个思路是共同做件事情(从个ArrayList中删除元素),如果执行完成了两个线程都停止执行
代码如下:
using;
using.Collections;
using.Collections.Generic;
using.Threading;
///<summary>
///在开发中经常会遇到线程例子如果某个后台操作比较费时间我们就可以启动个线程去执行那个费时操作同时继续执行在某些情况下可能会出现多个线程同步协同问题下面例子就展示了在两个线程的间如何协同工作
///
///这个思路是共同做件事情(从个ArrayList中删除元素),如果执行完成了两个线程都停止执行
///作者:周公
///时间:2008-5-17
///原发地址:http://blog.csdn.net/zhoufoxcn
///</summary>
publicThreadDemo
{
privateThreadthreadOne;
privateThreadthreadTwo;
privateArrayListList;
privateeventEventHandlerOnNumberClear;//数据删除完成引发事件
publicvoidMain
{
ThreadDemodemo=ThreadDemo(1000);
demo.Action;
}
publicThreadDemo(number)
{
Randomrandom=Random(1000000);
List=ArrayList(number);
for(i=0;i<number;i)
{
List.Add(random.Next.);
}
threadOne=Thread(ThreadStart(Run));//两个线程共同做件事情
threadTwo=Thread(ThreadStart(Run));//两个线程共同做件事情
threadOne.Name="线程1";
threadTwo.Name="线程2";
OnNumberClearEventHandler(ThreadDemo_OnNumberClear);
}
///<summary>
///开始工作
///</summary>
publicvoidAction
{
threadOne.Start;
threadTwo.Start;
}
///<summary>
///共同做工作
///</summary>
privatevoidRun
{
Value=null;
while(true)
{
Monitor.Enter(this);//锁定保持同步
Value=()List[0];
Console.WriteLine(Thread.CurrentThread.Name+"删除了"+Value);
List.RemoveAt(0);//删除ArrayList中元素
(List.Count0)
{
OnNumberClear(this,EventArgs);//引发完成事件
}
Monitor.Exit(this);//取消锁定
Thread.Sleep(5);
}
}
//执行完成的后停止所有线程
voidThreadDemo_OnNumberClear(objectsender,EventArgse)
{
Console.WriteLine("执行完了停止了所有线程执行");
threadTwo.Abort;
threadOne.Abort;
}
}
介绍说明:要实现线程同步不止这种方式在这里采用了事件在事件处理里中止了线程(主要是回答csdn论坛个朋友问题才用了这种办法)
转载于:https://blog.51cto.com/qianshao/203214