net4.0新特性之线程同步

有时候我们可能需要使用多线程来执行同一任务,这个任务可能包含多步,而每步之间可能并不相干,但是这个任务必须让所有步骤执行完成后才能够进入下一步。这就如同WF中的并行任务。在.net4.0之前我们可能需要几个类来做到同步。但是现在我们只需要1个类就OK。

代码

Console.WriteLine("任务启动"); using (CountdownEvent cd = new CountdownEvent(1)) { for (var i = 0; i < 5; i++) { cd.AddCount(); System.Threading.ThreadPool.QueueUserWorkItem( (o) => { //do something Console.WriteLine("线程:" + Thread.CurrentThread.ManagedThreadId + ",工作启动"); Thread.Sleep(5000); cd.Signal(); Console.WriteLine("线程:" + Thread.CurrentThread.ManagedThreadId + ",工作完毕 "); }); } cd.Signal(); cd.Wait(); }

通过以上代码,我们看到只需要使用CountdownEvent类的AddCount() 和 Signal()方法 就可能实现线程同步。

此外,还有一个类也能够实现线程同步:Barrier。然而这个类不是通过使用增加减少信号量来实现同步。在程序执行时我们可呢个为这个类定义需要接到几个信号后同步任务完成进入下一个任务。

Barrier _barrier = new Barrier(3);//接到3个任务后同步目标达成,进入下一个任务。

代码

Barrier _bar = new Barrier(3); ThreadPool.QueueUserWorkItem( (o) => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); _bar.SignalAndWait(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "is complete"); Thread.Sleep(2000); }); ThreadPool.QueueUserWorkItem( (o) => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); _bar.SignalAndWait(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "is complete"); Thread.Sleep(2000); }); ThreadPool.QueueUserWorkItem( (o) => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); _bar.SignalAndWait(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "is complete"); Thread.Sleep(2000); }); //以上3个任务完成以后,下一个任务才会执行 ThreadPool.QueueUserWorkItem( (o) => { Thread.Sleep(2000); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); _bar.SignalAndWait(); Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "is complete"); });

使用Task类进行任务控制:

1, 连续任务:

代码

Task<int> task1 = new Task<int>(() => { Console.WriteLine("Task1"); return 1; });
Task task2 = task1.ContinueWith( (prev) => { int result = prev.Result; Console.WriteLine("Task2," + result); }); //task1执行完以后执行这个任务 task1.Start();

2, 任务等待:

代码

Task t1 = Task.Factory.StartNew(() => { Console.WriteLine("task1"); });
Task t2 = Task.Factory.StartNew(() => { Console.WriteLine("task2"); });
Task t3 = Task.Factory.StartNew(() => { Console.WriteLine("task3"); });
Task.WaitAll(t1, t2, t3); Console.WriteLine("continue");

3, 容器任务

代码

Task container = new Task(() => { Task.Factory.StartNew(() => { Console.WriteLine("first"); }); Task.Factory.StartNew(() => { Console.WriteLine("second"); }); Task.Factory.StartNew(() => { Console.WriteLine("third"); }); }); container.Start(); // 等待整个任务的完成 container.Wait(); Console.WriteLine("continue"); Console.ReadKey();

4, 任务监视

代码

Task task1 = new Task( () => { Console.WriteLine("task1 is start"); int c = 0; while (c < 10) { Console.WriteLine(c); Thread.Sleep(1000); c++; } }); task1.Start(); while (!task1.IsCompleted) { Console.WriteLine("task1 not complete,wait..."); Thread.Sleep(1000); } Console.WriteLine("task1 is complete,continue!");

时间: 2024-10-09 18:24:04

net4.0新特性之线程同步的相关文章

ASP.NET4.0新特性

原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音以致放弃在LiveMeeting上的这次讲课,也导致了本篇的产生. 新增了项目模板 在创建Web项目时可以看到增加了更多的Web项目模板在VS2008中对应的情况如下: 在新模板中有如下改进:基础MemberShip功能.在大多数网站和应用程序中需要进行认证,因此在新模板中增加了认证功能使得用户能在

JDK5新特性之线程同步工具类(三)

一. Semaphore实现信号灯 Semaphore可以控制同时访问资源的线程个数, 例如: 实现一个文件允许的并发访问数. Semaphore实现的功能就类似厕所有5个坑, 加入有十个人要上厕所, 那么同时只能有5个人能够占用, 当5个人中的任何一个人离开后, 其中在等待的另外5个人中就有一个可以占用了. 另外等待的5个人中可以是随机获得优先机会, 也可以使按照先来后到的顺序获得机会, 这取决于构造Semaphore对象时传入的参数选项. /** * Semaphore:信号灯 */ pub

JDK5新特性之线程同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

Servlet3.0新特性

时间:2017-1-4 16:51 --Servlet3.0新特性概述 前提:    1.MyEclipse1.0或以上版本    2.发布到Tomcat7.0或以上版本 步骤:    1.创建JavaEE6.0项目        在web.xml文件中有如下字样,即JavaEE6.0项目(是否Servlet3.0) <web-app version="3.0"> 新特性:    1.使用@WbServlet.@WebFilter.@WebListener三个注解来替代we

Servlet 3.0 新特性概述

Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声: 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程.在接收到请求之后,Servlet 线

atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结

atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结 1. jar比较,j2ee 1.6 添加了许多的jar 1 2. ,Servlet 3.0 2 2.1. 可插性  web片段 2 2.2. 异步处理 3 2.3. anno支持filter,sevlet,listen 3 2.4. 三.元数据和通用注释 3 2.5. 现有API的改进 HttpServletRequest,,HttpServletRequest,,ServletContext,,dynac fi

[转]Servlet 3.0 新特性详解

原文地址:http://blog.csdn.net/xiazdong/article/details/7208316 Servlet 3.0 新特性概览 1.Servlet.Filter.Listener无需在web.xml中进行配置,可以通过Annotation进行配置: 2.模块化编程,即将各个Servlet模块化,将配置文件也分开配置. 3.Servlet异步处理,应对复杂业务处理: 4.异步Listener,对于异步处理的创建.完成等进行监听: 5. 文件上传API简化: tomcat

Java基础加强-(注解,类加载器,servlet3.0新特性)

1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的“name=value”对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特