HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:' C! y2 C& A3 r7 S& a5 j
! e0 C# }3 [% y$ Y: `( R, A public Object buildActions () {
; T% O9 m% \0 U2 Q5 y# { super.buildActions();
4 d. S# J+ K' ^2 N o( s0 A- Z
( M$ F9 c1 s& P L9 o // Create the list of simulation actions. We put these in
' W$ e/ F8 `* \ P // an action group, because we want these actions to be) v( }' r# v: _( J8 v4 T0 Q" B3 `
// executed in a specific order, but these steps should& H+ j0 ]( ?+ T( f5 G) ~* f3 X( }4 ?* @
// take no (simulated) time. The M(foo) means "The message% J z7 d+ b% z( v7 V+ ?8 f7 h. \
// called <foo>". You can send a message To a particular
' t$ o0 C8 n4 a; U // object, or ForEach object in a collection.
1 b) k; I" l) d9 j( Q1 Y) P8 u& C 0 i$ i2 ]6 c! Q1 ?1 D+ X0 m- x
// Note we update the heatspace in two phases: first run
, [5 y3 X4 f- R // diffusion, then run "updateWorld" to actually enact the
/ Y* j/ r: ~" B; T1 z // changes the heatbugs have made. The ordering here is5 ?6 S5 R \3 y+ c6 J `0 O, F
// significant!; C. b+ o" C7 t5 J
: r; n6 Q- ]! `7 p5 C. y // Note also, that with the additional1 M/ j8 E6 a S# m$ j9 ^4 ~
// `randomizeHeatbugUpdateOrder' Boolean flag we can( [# y# i7 ~- e" M$ k3 f' h! i% n
// randomize the order in which the bugs actually run
/ b0 g/ W% g: P# U // their step rule. This has the effect of removing any5 p# ~4 `2 C, I4 m6 e8 E
// systematic bias in the iteration throught the heatbug3 X4 b; L4 Q; p
// list from timestep to timestep
; ~- j; D0 C0 q' H8 V9 h' q. z G( s# W, o; c
// By default, all `createActionForEach' modelActions have E+ H4 g! J8 O3 D U. h7 d% C/ X
// a default order of `Sequential', which means that the7 q% n/ [* }( J- ]7 A* q
// order of iteration through the `heatbugList' will be/ N& [+ c# w: r# v
// identical (assuming the list order is not changed% x. E" Z* e% `. Q: w
// indirectly by some other process).
" _! O+ o: A8 Z/ P4 c! K1 L
. @8 G& u3 `; Z( Y modelActions = new ActionGroupImpl (getZone ());
) l' i) s- u6 `2 k3 a
' d3 @% c1 b7 V' T, b! m: \; k try {- r/ T; w0 n2 n$ }' p- x, [$ ?
modelActions.createActionTo$message3 `' r. P0 w3 f9 [4 I2 f
(heat, new Selector (heat.getClass (), "stepRule", false));$ N" n' U- o1 ]
} catch (Exception e) {9 K1 Q: d+ v" Q S3 [
System.err.println ("Exception stepRule: " + e.getMessage ()); o) j: i6 v6 H2 }4 J
}& v, e" t3 n L1 G2 Z
7 z: L! S1 V' q) p- k try {
1 b) ^/ v y. t% h; v& A } Heatbug proto = (Heatbug) heatbugList.get (0);
% Q& U5 Z! P. L0 U( v+ [ Selector sel =
$ @& Z" u3 J* s new Selector (proto.getClass (), "heatbugStep", false);9 r2 k! G2 {4 a: F$ `
actionForEach =
. {# S, y/ S( d1 _ modelActions.createFActionForEachHomogeneous$call$ y5 u; `- L; h" G, y z
(heatbugList,
) T3 Y6 W0 z" E8 m% R new FCallImpl (this, proto, sel,0 |' g! j% Q x# r8 `% h" k& t
new FArgumentsImpl (this, sel)));2 ~# [- x8 m! m2 a% x/ R. H0 j
} catch (Exception e) {0 F. q; L4 ^; d4 m; i* p3 _
e.printStackTrace (System.err);
4 h& C1 x9 }8 o* m' b: s. N }
+ T/ [& o" N `( U3 v' w% } ' B* v& f/ l4 g4 j8 N$ \
syncUpdateOrder ();
2 _* T9 ~: m8 H8 w5 P$ z/ X ~% n$ L
try {3 }3 G6 x. [% b$ @5 v/ E
modelActions.createActionTo$message
( ]. O2 U& X! T7 t3 w8 F3 @) \ (heat, new Selector (heat.getClass (), "updateLattice", false));
/ h8 W. m, N! E; c% y) v* }& P } catch (Exception e) {/ x$ y5 x" I+ o7 J8 A* |
System.err.println("Exception updateLattice: " + e.getMessage ());$ D7 }# Z. m8 u" ?! O; x8 ?3 L
}
$ b! e6 M* N) _% n8 S, e: G& B/ K, e
" [% G0 s3 y5 t7 ?# T // Then we create a schedule that executes the% h. \5 w' ~7 o( n. N3 }' g
// modelActions. modelActions is an ActionGroup, by itself it8 N- x( i; x* D# b* ]5 x
// has no notion of time. In order to have it executed in9 C2 R6 L" q5 Q7 a5 ?
// time, we create a Schedule that says to use the
2 G& U: X- S3 Z // modelActions ActionGroup at particular times. This
% }3 S( g0 e7 O# Y // schedule has a repeat interval of 1, it will loop every
0 M* G/ J1 F1 r! k% ]: L // time step. The action is executed at time 0 relative to
! ` ^; g3 A+ G: Q // the beginning of the loop./ _9 ]0 I; y: f! ]
/ y, D5 Q: @0 D
// This is a simple schedule, with only one action that is5 G; X- `; t4 `' W
// just repeated every time. See jmousetrap for more2 G8 y1 j4 k( i4 B& \- r C
// complicated schedules.
+ L8 M+ y6 i1 Y
@3 X3 o5 R Z modelSchedule = new ScheduleImpl (getZone (), 1);$ c6 ~: G7 E0 U( b
modelSchedule.at$createAction (0, modelActions);, V D' P' m0 m% E8 B+ o4 o
+ o# ^$ s! z2 h7 a& w/ {
return this;/ F$ i# D/ A$ W) ?! t9 x8 X
} |