HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
% n$ r+ T- Z$ m0 x+ e$ _4 Z7 [6 ^5 L6 h6 T `
public Object buildActions () {
: x# w# ?6 R9 z1 j super.buildActions();3 ^2 \* d3 `: X( W. U; `; n
" e# w9 v" i* r5 S" e( Z5 N. j' ]6 g // Create the list of simulation actions. We put these in$ ?8 F" F- \) a
// an action group, because we want these actions to be
2 R& x; v d7 U5 c1 H // executed in a specific order, but these steps should
' O* ]$ \- h! A- h# D. q0 X/ P // take no (simulated) time. The M(foo) means "The message
1 d2 d- S* ~# f0 P0 V // called <foo>". You can send a message To a particular
) h: A6 X6 k+ D0 d* g) G8 W" p/ S // object, or ForEach object in a collection.0 g- E3 k9 i* f" S+ h) I, N
7 u( E8 V: s. b$ j2 ]
// Note we update the heatspace in two phases: first run
& u" r2 T, y2 }$ [ // diffusion, then run "updateWorld" to actually enact the3 `2 a: g0 i$ h; u6 b7 @3 V6 H, P
// changes the heatbugs have made. The ordering here is9 P7 I1 m& q. C
// significant!
' K% \- u# V2 r! ?/ p% O) } ] {( v
8 y" G/ W. t& b+ j" h7 T8 g S // Note also, that with the additional
$ |" Z8 o" y3 `7 q% g& S // `randomizeHeatbugUpdateOrder' Boolean flag we can* X! Q/ e6 }0 ?! X
// randomize the order in which the bugs actually run
. U1 \+ C( `1 P) c2 b- ~$ K% ] // their step rule. This has the effect of removing any0 q- X T$ h$ l5 X& ^
// systematic bias in the iteration throught the heatbug
4 K7 p" G4 L) E" G/ O* h( j0 s // list from timestep to timestep
7 m- w7 u# U1 B- f 2 N/ z+ c9 t: E3 S
// By default, all `createActionForEach' modelActions have' y& L+ t$ I o2 r0 h# |& k
// a default order of `Sequential', which means that the
" t7 Z5 v: c, P- v6 W // order of iteration through the `heatbugList' will be) b4 y$ a" }1 v ~8 W4 O9 G
// identical (assuming the list order is not changed
& Q+ C" A' f0 C2 a // indirectly by some other process).1 T; G2 E$ |0 [1 y% `
1 O) a( Z+ t) b' ^) I% {
modelActions = new ActionGroupImpl (getZone ());
1 Q2 l- H. I; L$ O3 q3 m3 d" u7 v9 E+ H% _& L( m3 p& P7 Z
try {
( i' w3 F3 ~$ A* g modelActions.createActionTo$message t( ?- ]3 P% p# C# t- C3 `
(heat, new Selector (heat.getClass (), "stepRule", false));3 h0 P$ p( x3 B; J( r6 I
} catch (Exception e) {
' c$ b0 f, E( x& F0 I8 m1 B' c System.err.println ("Exception stepRule: " + e.getMessage ());
F& \5 g! c: b) g. T }5 E E+ v" a( F8 D$ |; Q
% M' |- C8 K" E* d: C! v- Q' j2 c try {) I0 ]* j/ v; w- d+ I x9 K/ _2 v7 a
Heatbug proto = (Heatbug) heatbugList.get (0);4 B- S& l3 X; J8 o+ Z
Selector sel = 2 Q: Z R, z( }2 O
new Selector (proto.getClass (), "heatbugStep", false);
6 Y# p. `8 D: w; M+ t actionForEach =8 o, o4 T2 i& r+ N" `( i) z
modelActions.createFActionForEachHomogeneous$call8 J8 ~1 J7 o6 y% ?0 z
(heatbugList,+ l. G/ s _, t4 I7 Q: n- L
new FCallImpl (this, proto, sel,6 ~+ p# M! X2 n8 Y6 j7 \ h( }
new FArgumentsImpl (this, sel)));
* O/ n4 _5 `+ l } catch (Exception e) {. T" ~3 M/ T& [
e.printStackTrace (System.err);
1 y# A" N0 y# Q }
9 i) i* E9 F! ?+ m& [* k
0 N( I2 _8 P) d9 r f9 U* { syncUpdateOrder ();
. x' q4 s7 [6 G( ]1 D& P& w7 u
% b$ H/ J! G% O) w. T+ \3 T try {
% [/ k+ E# A" `3 \ modelActions.createActionTo$message
1 T8 H8 T1 t4 [ (heat, new Selector (heat.getClass (), "updateLattice", false));
- w7 Y3 H9 N# B+ @- k } catch (Exception e) {- t5 Z& H# d3 ~# G& B6 ^
System.err.println("Exception updateLattice: " + e.getMessage ());6 x$ m3 J" B' }1 W p
}
% o) h+ X! D* e1 R! N' q 9 c+ w/ i5 t: F. S3 p" Y
// Then we create a schedule that executes the
6 l" K2 _+ \$ s' _% i // modelActions. modelActions is an ActionGroup, by itself it5 I( v5 E+ `# m% M: J
// has no notion of time. In order to have it executed in) }2 @1 F2 T( B4 c4 P4 Y! U) F/ A
// time, we create a Schedule that says to use the
5 K5 I, ]2 Q; m$ \. F; v+ E; |* S // modelActions ActionGroup at particular times. This5 i! H+ u5 w0 p% P+ F
// schedule has a repeat interval of 1, it will loop every
8 _9 a6 C/ A& L // time step. The action is executed at time 0 relative to, G1 v \' e/ l; S* m) O7 m
// the beginning of the loop.& A4 Q* L" X* Z" {( n) U
' K3 R; c, L( m' J; e3 l! f6 ~ // This is a simple schedule, with only one action that is4 C+ m9 I+ g5 E6 ^/ n" A+ i( ]
// just repeated every time. See jmousetrap for more
# c6 B, w! a# Y4 n // complicated schedules.
7 F$ Q6 [# G6 _+ o) s% v$ Y# t
. Y6 m& `5 X6 {* E7 G modelSchedule = new ScheduleImpl (getZone (), 1);9 _. L4 Y9 ]: c6 N
modelSchedule.at$createAction (0, modelActions);% [ d0 i# O( P" x0 ?
: s' g$ ]7 c' C) z Q& L
return this;7 i3 t+ b! w: B( m" O& a3 T: S! S
} |