摘要: 大家应该对生产者消费者模式都耳熟能详了吧,在push模式上建立pull模式(或者说把push模式转换成pull模式)和生产者消费者模式一样,都是在并发环境里的设计模式。我今后会在博客里介绍更多的并发设计模式(不仅仅限于多线程并发设计模式),很多都将会是原创的。今天就先发个上周挑战题的参考答案,分析再稍后几天。我这里说的分析是指对模式的分析,源代码就不一一分析了,但你有问题并留了言的话,我是会答复的。C#的部分代码在上周的帖子里(C#多线程编程擂台赛:解决pull和push模式在同一个程序中的冲突),Java的答案就全在这里了。C#: PullOnPushReader.cs 1 using S.阅读全文
posted @ 2012-12-18 14:54 Rex Young 阅读(890) 评论(5) 编辑
摘要: 这是一个以多线程编程为主题的擂台赛,欢迎C#和Java的程序员参加。我设计的这个题目是从工作中实战而来的,基本上来说需要中级的多线程编程水平就能轻松完成。有兴趣的网友可以在周末花几个小时,享受享受编程的乐趣。如果你完成了,请把你的源代码发在你自己的博客里,然后在此留言并给出链接,大家就可以帮你审查和评估了。过了周末如果没有结果,那我就会发一个参考答案。先来简单解释一下pull和push这两种模式,它们讲的是两个程序,一个接收者(consumer)和一个提供者(producer),在传递数据中所处的相对位置和实力。当接收者拥有线程,能通过主动调用提供者来获得结果,那这是一个pull模式。当接收者阅读全文
posted @ 2012-12-14 14:55 Rex Young 阅读(915) 评论(5) 编辑
摘要: 为了展示如何使用FastMessenger编写并发程序,我会重写或改写一些其它网友的多线程程序,给愿意学习和了解FastMessenger的朋友提供更多直观的范例。一般来说我会对原来的程序进行一些技术分析,得出原作者的设计意图和实现手段,然后解释用FastMessenger来重写或改写会使用哪些设计,最后给出源程序。这次我选择的是苏飞网友(本人在此表示感谢)的C#多线程网站压力测试程序,他的博客和相关博文地址如下:苏飞—C#.NetC#多线程|匿名委托传参数|测试您的网站能承受的压力|附源代码C#多线程|匿名委托传参数|测试您的网站能承受的压力|附源代码--升级版据他自己介绍,这个程序虽然有一阅读全文
posted @ 2012-12-11 13:59 Rex Young 阅读(1293) 评论(8) 编辑
摘要: 设定首先,请参考上一篇的博文,里面有对系列的解释和FastMessenger的下载地址。本系列的第一个示范程序,当然应该选择一个最简单的程序。这个最简单不是和“Hello World!”相比,而是和其他的并发程序相比。因为你要并发的话,那至少要有两个任务吧。这样这个示范程序就需要有一个主逻辑(就是调用子任务),和两个子任务。为了进一步简化程序,这里只提供一个子任务的代码,该子任务通过接收不同的参数,来模拟不同的任务。这个示范程序首先会被写成顺序执行的,作为后续两个并发版本的基准版。然后我把它改写成显式多线程的版本,在这里“显式”多线程指的是在程序里直接创建和使用的线程,我用这个词来和使用线程池阅读全文
posted @ 2012-12-05 14:48 Rex Young 阅读(747) 评论(0) 编辑
摘要: 前几个月,我断断续续地写了几篇博客介绍了FastMessenger的原理和基本元素。FastMessenger的一个设计目标是能在大多数应用中取代线程、线程池、以及TPL(Task Parallel Library),并简化C#程序员开发并发程序时的设计和编码的难度。在接下来的几个月,我将通过各种范例程序来介绍如何用FastMessenger开发并发程序。我本来是Java程序员,这次选择用C#来写这个系列,是为了强迫自己尽量贴近新手的角度,尽量暴露出问题,有利于我自己和大家获得最大的收益。这个系列是关于如何应用FastMessenger的,所以非常欢迎大家的参与,特别是C#新手:想写并发程序但阅读全文
posted @ 2012-12-03 15:00 Rex Young 阅读(57) 评论(0) 编辑
摘要: 在 OO 语言写的程序里面,object 之间最基本的动作是同步功能调用(synchronous method invocation)。Fast Messenger 编程方法在不改动这个基本动作的前提下,实现了 object 之间的(虚拟)异步功能调用(asynchronous method invocation)。其基本思想是在两个 object 之间插入一个中间人 object,然后用两个同步功能调用模拟出一个异步功能调用。FM 将一些众所周知的编程元素(比如编程模式,编程小窍门等)以创新的方式组织起来,达到了这个目的。本文将这些编程元素列举出来,并配上简单说明。以后会另有博文对其做具体解阅读全文
posted @ 2012-11-11 07:45 Rex Young 阅读(709) 评论(0) 编辑
摘要: 我把 FM project 放在 java.net 上,主要是因为我从第一版就开始使用 Java 了,而且 FM 最早的实现也是用的 Java。现在我把 FM 分成了两部分:一个是 model 及相关的文档、范例等;而一个是 FM 在其它 OOP 语言上的实现,比如 C# 和 JavaScript。FM现在是一个跨语言的 project 了,我觉得把它放在 GitHub 上比较合适。FM 在 GitHub 上的地址是:https://github.com/fastmessenger目前有四个 repositories:一个给 model 以及文档,放在 model 的 wiki 里;另外三个放阅读全文
posted @ 2012-11-10 16:01 Rex Young 阅读(23) 评论(0) 编辑
摘要: 高级编程语言在编程界,当用“高级”来形容一种编程语言时,那是表示这种编程语言含有接近人类语言的结构和语法。或者反过来说,在坐标另一轴的“低级”表示一种编程语言的结构和语法更直接反映硬件的特性,比如:机器代码及其体系结构。高级并发编程模式这个概念启发我建立了一个类似的标准来描述并发编程的模式和技术。“高级”用来表示一种并发编程模式的思维方式更接近人类的,而“低级”则表示更接近机器的思维方式。评价一种模式是高级还是低级,一般要观察它的静态特性和动态特性。静态特性指的是它有哪些结构可以给程序员用来构建程序,这些结构是更象人类的思考模式还是机器的。比如一个整数数组,甲语言要求全是整数;乙语言里可以是整阅读全文
posted @ 2012-09-12 15:21 Rex Young 阅读(1355) 评论(3) 编辑
摘要: 在日常编程中,很多程序由多个小一点的部分组成。这个程序运行这些小的部分,获得它们的结果,并用这些结果来计算出整个程序的结果。很多算法也是这样的,一个算法有几个步骤,每一步的结果都对最终结果有影响。一般来说这样的程序和算法都是顺序型的,除非是专门的并发算法,或者是有时间要求的高性能程序。如果要你去编写或重构一个这样的顺序程序,但又包含并发的部分,你会需要什么样的编程技术呢?现代的语言象Java和C#,都有内置的线程支持。但问题是线程是一种低级(接近机器硬件)的技术,大部分时间经常是花在改程序结构来容纳线程,而不是让线程来为你的程序服务。幸运地是Java和C#大约从2005开始提供更完善的编程技术阅读全文
posted @ 2012-08-06 13:23 Rex Young 阅读(1189) 评论(0) 编辑
摘要: Fast Messenger 能帮你的 JavaScript object 和 function 发送 message,不论是在主 UI 线程中,web worker 中,甚至是跨越 UI 和 webworker 线程。这样的话,你的 JavaScript 程序立即自动地编成了多线程的了。在这里我会用到一些代码,你可以在上一篇博文中找到完整的范例代码,或者直接下载本 project 的 zip。首先我们来看看单例模式。你可以创建一个 Messenger 的单例,把你能接受的 message 的 object 注册好,然后就可以向他们发 message 了。 1 // Create a new 阅读全文
posted @ 2012-05-04 14:17 Rex Young 阅读(769) 评论(0) 编辑
摘要: 之前可以在 Java 和 C# 里用的 Fast Messenger 编程方法,现在可以在 JavaScript 里使用了。这里列出了三个范例。第一个演示在一个普通的 HTML 页面如何使用 active object 来简化 JavaScript 代码。http://www.fastmessenger.com/demo/javascript/examples/SingleMessenger/SingleFmUI.html第二个展示使用几乎相同的代码,来充分使用一个 Web Worker。http://www.fastmessenger.com/demo/javascript/examples阅读全文
posted @ 2012-05-01 16:20 Rex Young 阅读(1168) 评论(0) 编辑
摘要: FM Lite 是一个特别剪裁的 FM 的子集,目的是用来和多线程编程竞争。Lite 是 1.3.X 版的代码名,目前的 X 是74,版本号里的第三个数字是该版的 SVN 的 revision 号码。这里是下载地址(http://java.net/projects/fastmessenger/downloads)。下载的 ZIP 文件中有 Java 和 C# 的源代码,同时也包含两个范例程序的源码。完整的 Fast Messenger 是一个基于 active object 模型的 implementation。因为 active object 模型并没有一个广泛认可的定义或 specific阅读全文
posted @ 2012-04-26 09:58 Rex Young 阅读(750) 评论(0) 编辑
摘要: Fast Messenger 提供了一个类似 Java中的 Future 的功能,叫做 FutureReply。普通的、顺序执行的程序将可以在自身流程不变的情况下使用 Fast Messenger 的高并发的异步通讯。你发一个 message 出去的时候,会得到一个 FutureReply 实例,而不是被阻塞一直到有回复。拿到 FutureReply 后,你的程序该干什么的继续干什么,直道它完全准备好了,再用 FutureReply 来看看有回复没有。象一般的 Future 一样,FutureReply 允许你光检查状态(non-blocking),也允许你死等(blocking)。Fast 阅读全文
posted @ 2012-04-05 15:14 Rex Young 阅读(774) 评论(4) 编辑
摘要: 本文将再次回到上次的 Quick Sort 例子,通过对其 Active Object 方案代码的分析,介绍几个关于基于 Active Object 编程方法的基本概念。比如:什么是 active object?他们是如何命名的?如何通过一个命名来找到对应的 active object(也就是寻址)?他们是如何互动的(是否通过调用method)?你可以如何使用它们?本文将通过引用 quick sort 的程序来说明这些概念。Active Object 是 OOP 里面的概念,但一直没有明确的定义和应用,属于 OOP 里面的灰色领域。(这也是 Fast Messenger 号称 OOP 2.0 阅读全文
posted @ 2012-04-02 03:39 Rex Young 阅读(857) 评论(0) 编辑
摘要: 本文介绍了两种不同的编程技术来写并发的 Quick Sort。一种是用传统的多线程,另一种是用 Active Object(由 Fast Messenger framework 提供支持)。源程序和所需的 Fast Messenger framework本文列出了一些源程序,主要是为了配合讲解的需要。要看完整版、或想要实际运行这个程序的话,请到 Fast Messenger 项目处下载(http://java.net/projects/fastmessenger/downloads)。一共需要两个 jar 文件(如下),一个是 framework 本身,另一个是本文所介绍的 Quick Sor阅读全文
posted @ 2012-03-29 12:53 Rex Young 阅读(1239) 评论(2) 编辑
摘要: 本文是本人英文博文的中文版。(英文博文地址:http://weblogs.java.net/blog/rexyoung/archive/2012/03/18/fibonacci-function-example-how-write-concurrent-programs-without-multi-threading)本文使用了三种不同的编程方法:顺序,多线程,和 Active Object (通过 Fast Messenger framework 来支持)来实现 Fibonacci 函数。根据定义,Fibonacci序列中的每一个数都是其前两个数的和(从 0 和 1 开始)。F(n) = F阅读全文
posted @ 2012-03-20 16:04 Rex Young 阅读(1078) 评论(2) 编辑

