20150924
来源:互联网 发布:淘宝店铺装修数据包 编辑:程序博客网 时间:2024/05/01 11:49
//ThreadPool.QueueUserWorkItem线程池,解决了相应问题。例子中先点击button1,再button2,会先响应button2,addtest会再后台运行
public Form1()
{
InitializeComponent();
}
private voidbutton1_Click(object sender,EventArgs e)
{
ThreadPool.QueueUserWorkItem(newWaitCallback(addtest),"Testaa");
}
private void addtest(object aa)
{
long result = 0;
for (int i = 0; i< 1000000000; i++)
{
result += i;
}
MessageBox.Show(result.ToString() +aa.ToString());
}
private voidbutton2_Click(object sender,EventArgs e)
{
MessageBox.Show("two");
}
}
ManualResetEvent
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
static ManualResetEvent _mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread[]_threads = new Thread[3];
for (int i = 0; i <_threads.Count(); i++)
{
_threads[i]= new Thread(ThreadRun);
_threads[i].Start();
}
}
static void ThreadRun()
{
int _threadID = 0;
while (true)
{
_mre.WaitOne();
_threadID= Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("currentTread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds(2));
}
当初始化为true时,为终止状态
static ManualResetEvent _mre = new ManualResetEvent(true);
执行结果
当初始化为false时,为非终止状态
static ManualResetEvent _mre = new ManualResetEvent(false);
执行结果为
把非终止状态改为终止状态用Set()方法
把终止状态改为非终止状态用Reset()方法
/*1、this.manualEvent.Reset(); //将事件状态设置为非终止状态,导致线程阻止。
2、this.manualEvent.Set(); //将事件状态设置为终止状态,允许一个或多个等待线程继续。*/
我用用代码来实现它们只要把我们上 边的代码做一下改动
class Program
{
static ManualResetEvent _mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("输入1为Set() 开始运行");
Console.WriteLine("输入2为Reset() 暂停运行");
Thread[] _threads = new Thread[3];
for (int i = 0; i < _threads.Count(); i++)
{
_threads[i] = new Thread(ThreadRun);
_threads[i].Start();
}
while (true)
{
switch (Console.ReadLine())
{
case "1":
_mre.Set();
Console.WriteLine("开始运行");
break;
case "2":
_mre.Reset();
Console.WriteLine("暂停运行");
break;
default:
break;
}
}
}
static void ThreadRun()
{
int _threadID = 0;
while (true)
{
_threadID = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("current Tread is " + _threadID);
Thread.Sleep(TimeSpan.FromSeconds(2));
_mre.WaitOne();
}
}
}
当输入1 时会调用 Set()方法 ManualResetEvent 处于终止状态会WaitOne不会阻塞线程会一直运行下去
当输入2时会调用 Reser()方法ManualResetEvent处于非终止状态WaitOne会阻塞线程直到再调用 Set()方法
看一下执行结果吧
- 20150924
- 天声人語 20150924
- 日经春秋 20150924
- 二叉树镜像--20150924
- 英语翻译之路-4-20150924
- 用栈实现队列--20150924
- 反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
- 一切成功源于积累——20150924 美国耐用品订单符合预期为负值 黄金1小时1600点
- Tomcat端口更改失效的解决方法
- javaScript 中 typeof 和 instanceof
- MySQL的权限有哪些?
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- More Effective C++ ——019_理解临时对象的来源
- 20150924
- linux 查看网卡流量六种方法
- centos7为yum添加源
- python之os库
- 关于Eclipse配置的一些链接
- poj 2398 Toy Storage
- UI - Delegate模式
- Java的四种引用,强弱软虚,用到的场景
- easyui表单验证easyui-validatebox