由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - FMP tutorial
相关主题
FMP mini profileFMP 已经在 maven central repository 里了
FMP 3.0 Mitbbs 首发 — 求建议求反馈FMP for concurrent programming 招生(免费辅导)
FMP 进驻 Programming 版写thread safe程序现在也是程序员必须要掌握的了吧
请教一下 open source 的 目录Java 多线程 的架构如何改进?
FMP 一个完整可运行的范例程序FMP3分布式编程
FMP vs ExecutorService/Future请问有没有大侠在windows下用netbeans调用glib
java update main UI from child thread issue (转载)ask a question about compile shared library using libtool
FMP supports UI thread in both Swing and SWTWeb Seminar host by CINAOUG at 2011/05/02 7PM EST (转载)
相关话题的讨论汇总
话题: fmp话题: messenger话题: object话题: active
进入Programming版参与讨论
1 (共1页)
o**2
发帖数: 168
1
最近正在写一个learn fast messenger programming by example的tutorial。计划有
以下这几篇,前三篇已经完成了,在http://fastmessenger.com/knowledgebase/
已完成:
Example 1: Create a FMP program from refactoring
Example 2: Create a FMP program from scratch
Example 3: Implement active objects
快完成:
Example 4: An active object is a single headcount
Example 5: An active object could be a group headcount
Example 6: Active objects in GUI programs
(注1:single headcount概念用来说明一个active object在处理能力上相当于一个单
人。)
(注2:group headcount概念用来说明一个active object在处理能力上相当于一个多
人组成的group。)
(注3:headcount是一个measurable unit of capacity of concurrence。)
(注4:example 6 展示messenger在幕后给特定active object分配特定thread的能力
。)
n******t
发帖数: 4406
2
说实话,你这么搞有什么好处么?

【在 o**2 的大作中提到】
: 最近正在写一个learn fast messenger programming by example的tutorial。计划有
: 以下这几篇,前三篇已经完成了,在http://fastmessenger.com/knowledgebase/
: 已完成:
: Example 1: Create a FMP program from refactoring
: Example 2: Create a FMP program from scratch
: Example 3: Implement active objects
: 快完成:
: Example 4: An active object is a single headcount
: Example 5: An active object could be a group headcount
: Example 6: Active objects in GUI programs

b*******s
发帖数: 5216
3
非要有好处吗

【在 n******t 的大作中提到】
: 说实话,你这么搞有什么好处么?
o**2
发帖数: 168
4
你问的是:在这里推广FMP的好处?还是使用FMP的好处?

【在 n******t 的大作中提到】
: 说实话,你这么搞有什么好处么?
t****t
发帖数: 6806
5
不知道netghost, 但是我是来问使用FMP的好处的, 前面你说了一堆, 我没看到什么好
处呀.

【在 o**2 的大作中提到】
: 你问的是:在这里推广FMP的好处?还是使用FMP的好处?
o**2
发帖数: 168
6
首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
thread。(当然不是一对一的简单替代。)
如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
对比和总结好处。)
这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
节的东西。
你经常用多线程编程吗?

【在 t****t 的大作中提到】
: 不知道netghost, 但是我是来问使用FMP的好处的, 前面你说了一堆, 我没看到什么好
: 处呀.

b***i
发帖数: 3043
7
比如,按下一个按钮要打开文件,能用你这个多线程读入文件吗?给个具体例子吧。
程序就叫FMPTest,extends JFrame,里面有一个JLabel,一个JButton, 要求点击
JButton打开FileDialog,选好文本文件后,用FMP线程读入,然后在JLabel里面显示
Good出现的次数。要求不能在UI线程里面读入文件。

FMP

【在 o**2 的大作中提到】
: 首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
: thread。(当然不是一对一的简单替代。)
: 如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
: 的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
: 对比和总结好处。)
: 这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
: 使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
: 节的东西。
: 你经常用多线程编程吗?

o**2
发帖数: 168
8
你说的基本上是 example 6 的内容,我今天可以抽时间先给你写一个源程序。请稍候
数小时。
其实我之前已经写过一个类似的GUI程序了:
http://www.mitbbs.com/article_t0/Programming/31254349.html
FMP 支持 JavaFX, Swing and SWT 中的 UI thread

【在 b***i 的大作中提到】
: 比如,按下一个按钮要打开文件,能用你这个多线程读入文件吗?给个具体例子吧。
: 程序就叫FMPTest,extends JFrame,里面有一个JLabel,一个JButton, 要求点击
: JButton打开FileDialog,选好文本文件后,用FMP线程读入,然后在JLabel里面显示
: Good出现的次数。要求不能在UI线程里面读入文件。
:
: FMP

t****t
发帖数: 6806
9
我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.

FMP

【在 o**2 的大作中提到】
: 首要的好处是写并发程序更简单、更不容易出错了,因为FMP用active object取代了
: thread。(当然不是一对一的简单替代。)
: 如果你对这个context有了解、并目前需要用多线程的话,我才好更有针对性的介绍FMP
: 的好处。(这个tutorial只是介绍FMP本身,供人查询和了解细节用的,并没有涉及到
: 对比和总结好处。)
: 这个前提是我经过无数挫折总结出来的,我的最终结论就是我只能面对面地对别人介绍
: 使用FMP的好处,因为要花很多时间把人带到特定的并发编程领域,然后才能涉及更细
: 节的东西。
: 你经常用多线程编程吗?

b***i
发帖数: 3043
10
你有完整代码吗?假定多线程打开文件搜索的结果就是555,你写个完整的程序让咱看看
到底好在哪里

【在 o**2 的大作中提到】
: 你说的基本上是 example 6 的内容,我今天可以抽时间先给你写一个源程序。请稍候
: 数小时。
: 其实我之前已经写过一个类似的GUI程序了:
: http://www.mitbbs.com/article_t0/Programming/31254349.html
: FMP 支持 JavaFX, Swing and SWT 中的 UI thread

相关主题
FMP vs ExecutorService/FutureFMP 已经在 maven central repository 里了
java update main UI from child thread issue (转载)FMP for concurrent programming 招生(免费辅导)
FMP supports UI thread in both Swing and SWT写thread safe程序现在也是程序员必须要掌握的了吧
进入Programming版参与讨论
o**2
发帖数: 168
11

这里是完整的可运行的代码。需要的FMP库在: http://search.maven.org/#browse|1968728870
import com.fastmessenger.impl.GuiMessenger;
public class Main {
public static void main (String[] args) {
GuiMessenger messenger = new GuiMessenger ();
FMPTest win = new FMPTest (messenger);
FileAnalyzer analyzer = new FileAnalyzer (messenger);
messenger.registerSwingReceiver (win, "main.frame", "setStatus");
messenger.registerReceiver (analyzer, "file.analyzer", "countWord");
win.pack ();
win.setVisible (true);
}
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import com.fastmessenger.impl.GuiMessenger;
public class FMPTest extends JFrame {
private GuiMessenger messenger;
private JLabel statusLabel;
private JButton fileButton;
public FMPTest (GuiMessenger messenger) {
super ("Test FMP in GUI");
setDefaultCloseOperation (EXIT_ON_CLOSE);
this.messenger = messenger;
statusLabel = new JLabel ("init");
fileButton = new JButton ("Select a file");
fileButton.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent e) {
JFileChooser fc = new JFileChooser ();
int returnVal = fc.showOpenDialog (FMPTest.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile ();
FMPTest.this.messenger.sendMessage ("file.analyzer:
countWord", file, "Good");
}
}
});
getContentPane ().add (statusLabel, BorderLayout.NORTH);
getContentPane ().add (fileButton, BorderLayout.SOUTH);
}
public void setStatus (String status) {
System.out.println ("setStatus() in the thread: " + Thread.
currentThread ().getName ());
statusLabel.setText (status);
}
}
import java.io.File;
import com.fastmessenger.impl.GuiMessenger;
public class FileAnalyzer {
private GuiMessenger messenger;
public FileAnalyzer (GuiMessenger messenger) {
this.messenger = messenger;
}
public void countWord (File file, String word) {
System.out.println ("countWord() in the thread: " + Thread.
currentThread ().getName ());
// read file and process the contents in the file
String status = "Search word '" + word + "' in the " + file.
getAbsolutePath ();
messenger.sendMessage ("main.frame:setStatus", status);
}
}

【在 b***i 的大作中提到】
: 你有完整代码吗?假定多线程打开文件搜索的结果就是555,你写个完整的程序让咱看看
: 到底好在哪里

o**2
发帖数: 168
12
从被调用的object的角度来看,messenger.sendMessage ()和 messenger.callService
()是一样的。
从调用者的角度来看,messenger.callService ()会返回一个IReturn,也就是Future
,通过它调用者可以得到被调用的object的return value。
o**2
发帖数: 168
13
把FMP收窄到和future相比,那就很好回答了。我准备一下,今晚或明天答复你。

【在 t****t 的大作中提到】
: 我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
: 答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
: 明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.
:
: FMP

t****t
发帖数: 6806
14
这种事情还要准备的...答辩?

【在 o**2 的大作中提到】
: 把FMP收窄到和future相比,那就很好回答了。我准备一下,今晚或明天答复你。
o**2
发帖数: 168
15
作为一个open source project,FMP出来混总是要面对各种疑问的,我好好总结一下,
这个主题可以作为一个FAQ的条目。
欢迎多问问题 :)

【在 t****t 的大作中提到】
: 这种事情还要准备的...答辩?
b***i
发帖数: 3043
16
用了一下,看起来不错。是挺方便的。

);

【在 o**2 的大作中提到】
: 作为一个open source project,FMP出来混总是要面对各种疑问的,我好好总结一下,
: 这个主题可以作为一个FAQ的条目。
: 欢迎多问问题 :)

o**2
发帖数: 168
17
多谢肯定。已加了你的linkedin。你要是有GitHub帐号的话,欢迎关注https://github
.com/fastmessenger

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

o**2
发帖数: 168
18
突然想起我以前有一篇blog从抽象的角度比较thread,thread pool,和FMP。结论是
FMP比thread pool(future是该model的一个成员)还要高级,就象C比汇编高级的那种
高级。
[obsolete] Fast Messenger: a high-level concurrent programming model
https://weblogs.java.net/blog/rexyoung/archive/2012/09/11/obsolete-fast-
messenger-high-level-concurrent-programming-model
请你看完之后告诉我一声,看看我算不算交差了。当然,欢迎接着提问!

【在 t****t 的大作中提到】
: 我用多线程, 不过我觉得这不是很重要. 从前面的介绍来看, 很多人问, 但是你没有回
: 答的问题是: FMP和现有的future相比, 有什么好处? 从我自己的理解来看, 没有什么
: 明显的好处, 所以请你进一步介绍一下, 理论或者实例都可以.
:
: FMP

o**2
发帖数: 168
19
新坑:FMP vs ExecutorService/Future
http://www.mitbbs.com/article_t/Programming/31258897.html

【在 t****t 的大作中提到】
: 这种事情还要准备的...答辩?
o**2
发帖数: 168
20
把你的問題搬到這裏來了,等inputking活過來了再聊。

何做呢?

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

相关主题
Java 多线程 的架构如何改进?ask a question about compile shared library using libtool
FMP3分布式编程Web Seminar host by CINAOUG at 2011/05/02 7PM EST (转载)
请问有没有大侠在windows下用netbeans调用glib[question] what is the time complexity of qsort in standard c libarary(GCC, more specifically)?
进入Programming版参与讨论
o**2
发帖数: 168
21

何做呢?
FMP本身不提供强制中断的机制,这和FMP的model有关,model里的每个active object
都是平等的,你只能发message发request给一个active object,但不能干涉它如何处
理它的message。
所以干涉或中断的责任就由用户承担了。比如之前的FileAnalyzer要实现“中断查找”
就要能接受两种message。一是开始,二是终止。然后在查找的过程中要时不时的暂停
,看看有没有终止message进来。这个暂停的效果,目前也是由用户用message来实现的。
下面是改写后的FileAnalyzer。
public class FileAnalyzer {
private GuiMessenger messenger;
private boolean working;
public FileAnalyzer (GuiMessenger messenger) {
this.messenger = messenger;
}
public void countWord (File file, String word) {
working = true;
messenger.sendMessage ("file.analyzer:resumeCounting", file, word, 0
, 0);
}
public void stopCounting () {
working = false;
}
public void resumeCounting (File file, String word, long pos, int count)
{
if (!working) {
return;
}
boolean finishedEntireFile = false;
// A small piece of work:
// 1, open file
// 2, read XXX more bytes/lines from position at
// 3, update , , and
// 4, close file
if (finishedEntireFile) {
stopCounting ();
messenger.sendMessage ("main.frame:setStatus", "xxxx");
} else {
messenger.sendMessage ("file.analyzer:resumeCounting", file,
word, pos, count);
}
}
}

【在 b***i 的大作中提到】
: 用了一下,看起来不错。是挺方便的。
:
: );

o**2
发帖数: 168
22
Main class 也要相应地加上:
messenger.registerReceiver (analyzer, "file.analyzer", "countWord", "
stopCounting", "resumeCounting");
c*****n
发帖数: 75
23
大概看了一下。 问几个问题。 (不是来挑刺的)。
1) FMP 和 Qt/Glib 的 Signal framework 有什么本质不同吗? 好像都是 work
submission。 在submit work/task/ 的时候, caller 提供 target object, target
method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
Messenger有eventloop 吧。
2) 对没有Runtime Type Information 的语言, 如C, C++, FMP 可用吗?Glib/C
implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
问题。
o**2
发帖数: 168
24
有本质的不同,体现在FMP比task更进了一步。首先,FMP把这些task集中起来放在一个
active object里了;然后再对这个active object抽象了一次,把它完全变成了一个
object的spec;最后,由其它一个(甚至多个)solid的impl object来实现这个spec。
(see figure below)
FMP里的messenger object是整个体系的关键,不同的messenger implementations只要
能维持active object的spec和语义一致不变,那user programs就完全不受影响了。于
是messenger object在内部怎么搞都可以了,比如:可以用一个impl object;可以用
多个impl objects来支持一个active object;甚至可以用非object,比如C,来实现这
个active object;再比如可以自由安排内部的thread等。
FMP对message的data type没有定义,完全留给实现者根据具体的语言决定其特定的风
格。这也导致了FMP不能实现在编译时做静态类型检查。

submission。 在submit work/task/ 的时候, caller 提供 target object, target
method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
Messenger有eventloop 吧。
implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
问题。

【在 c*****n 的大作中提到】
: 大概看了一下。 问几个问题。 (不是来挑刺的)。
: 1) FMP 和 Qt/Glib 的 Signal framework 有什么本质不同吗? 好像都是 work
: submission。 在submit work/task/ 的时候, caller 提供 target object, target
: method, target arguments. 最后work给提供到一个eventloop里。 在 FMP里,
: Messenger有eventloop 吧。
: 2) 对没有Runtime Type Information 的语言, 如C, C++, FMP 可用吗?Glib/C
: implement了复杂的 Type System, Qt/C++ 提供了MOC compiler 来解决 C/C++ 的 RTI
: 问题。

c*****n
发帖数: 75
25
还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
messenger里面。
比如,
在例5中,fileButton.setOnAction(),
1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主
要优势?application在通常情况下要自行定义messenger吗?
o**2
发帖数: 168
26
我之前给你的回复,是基于Java中标准的task,因为你把它归类到task,我就当成是一
回事了。
我对Qt并不了解,刚才看了一下Qt的文档(http://qt-project.org/doc/qt-4.8/signalsandslots.html)。觉得在GUI的单线程环境下,你说得对,Qt的确和FMP有很大的相似性。
我今晚找个时间仔细看一下Qt的文档,再和你继续讨论。

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

o**2
发帖数: 168
27
http://qt-project.org/doc/qt-4.8/signalsandslots.html
看了上面Qt Signals & Slots的文档,发现它和FMP不但本质不同,连表面都不同。我
这里就在Qt能做的事的范围内挑几条来简单比较一下,FMP能做而Qt不能做的就不提了。
1,被调用的class and methods
Qt:Slot functions除了和signals配合用之外,也可以当普通function来用。但是在
source里必须subclass QObject,并写上“public slots:”。
FMP:source里不需要任何特殊处理,只要注册的时候申明,如:guiMessenger.
registerJavaFxReceiver (this, "file.frame", "setStatus")。
FMP也可以使用marker interface IReceiver来写class and methods:
public class Calculator implements IReceiver {
public Object onPortRequest (String port, Object... args) {
}
}
2,调用者
Qt:当成对用slot的时候,caller必须是signal function。
FMP:只要有messenger的reference,任何地方的代码都可以调用active object。
3,同步/异步
Qt:有时同步,有时异步,从source上看不出来。
FMP:总是异步,但可以用两行来同步:1,IReturn defer =callServer();2,defer.
get()。非常方便,source code读起来没有歧义。
4,寻址
Qt:只能用connect来间接寻址。
FMP:可以直接,可以间接,比如:publishMessage(source,target)

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

o**2
发帖数: 168
28
如果一定要用上eventloop这个概念的话,应该是每一个active object有一个自己的
eventloop。
你提到的例5里面,只有一个messenger instance,就是在125行处的new GuiMessenger
()。然后这个instance被传到了FileAnalyzer里去。
GuiMessenger可以精确的使用特定的thread执行一个特定的active object。
Active object "file.frame"是在127行用guiMessenger.registerJavaFxReceiver (
this, "file.frame", "setStatus");来注册的,所以guiMessenger在内部会用JavaFX
的thread来执行"file.frame"。
而active object "file.analyzer"是在130行注册的普通active object,
guiMessenger将用ThreadPool里的thread来执行"file.analyzer"。
但对使用的user program来说,调用它们是没有区别的。

【在 c*****n 的大作中提到】
: 还是看不出本质差别。你的tutorial你的例子用Qt的signal API可以轻易替换。在
: performance上回有差别吗? 就像我说问的, 你把每一个eventloop移到了对应
: messenger里面。
: 比如,
: 在例5中,fileButton.setOnAction(),
: 1) setOnAction() 在 SWING的eventloop 中执行, 并invoke 2)
: 2) file.analyzer:countWord 在 guiMessenger中执行, 并invoke 3)
: 3) file.frame:setStatus" 在 FileAnalyzer 的 Messenger中执行
: 可以看出active object 可自行定义messenger. 不如 2)和3)的messenger 可以
: 是同一个thread eventloop 也可以是不同的。 这个自行定义messenger是否FMP的主

1 (共1页)
进入Programming版参与讨论
相关主题
Web Seminar host by CINAOUG at 2011/05/02 7PM EST (转载)FMP 一个完整可运行的范例程序
[question] what is the time complexity of qsort in standard c libarary(GCC, more specifically)?FMP vs ExecutorService/Future
什么是OS Memory management and heap structure?java update main UI from child thread issue (转载)
Ryan DL的心声...FMP supports UI thread in both Swing and SWT
FMP mini profileFMP 已经在 maven central repository 里了
FMP 3.0 Mitbbs 首发 — 求建议求反馈FMP for concurrent programming 招生(免费辅导)
FMP 进驻 Programming 版写thread safe程序现在也是程序员必须要掌握的了吧
请教一下 open source 的 目录Java 多线程 的架构如何改进?
相关话题的讨论汇总
话题: fmp话题: messenger话题: object话题: active