HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:+ ]6 J* q+ }" _' q; k/ s
, q8 @# W( T& r4 S7 K
public Object buildActions () {/ C( x7 ^4 q- v# |: v/ j7 e
super.buildActions();
7 E" J# P f/ w0 h1 o- Z
& w' p% S7 V! R; \! f/ j! T // Create the list of simulation actions. We put these in# E1 H- u, g8 c
// an action group, because we want these actions to be6 ]3 n2 L" s) I$ A8 c: Q
// executed in a specific order, but these steps should( K! z+ ?8 ~! T% e, {; b4 a0 F6 G
// take no (simulated) time. The M(foo) means "The message
- L# C/ e8 p$ J, I, }* P // called <foo>". You can send a message To a particular
6 Z3 m/ c+ Y" V! [ j3 S5 y // object, or ForEach object in a collection.' s( |5 c$ \, N: b; [/ E5 F
$ M8 S7 i4 k9 M8 O7 T2 \2 F4 C // Note we update the heatspace in two phases: first run
$ a% I: _- d$ Z // diffusion, then run "updateWorld" to actually enact the4 F# z/ e' R2 L( z' y/ r
// changes the heatbugs have made. The ordering here is* K( ~5 S2 k+ n- ^, Z" v6 A/ w
// significant!
, Y7 ]4 e9 D; i( G, F/ J" ~
, V7 m1 K- Q9 n$ l // Note also, that with the additional
/ C# n1 z/ S. s$ o* f y5 R3 e // `randomizeHeatbugUpdateOrder' Boolean flag we can
3 \+ i# }. A7 M( ]3 y! d( J3 k: D; |) r // randomize the order in which the bugs actually run0 u" n- ]+ u: X& k7 X' c4 E3 q b8 J
// their step rule. This has the effect of removing any
6 { \6 ?1 }( l C% j3 ]& r( o // systematic bias in the iteration throught the heatbug3 E5 _; m% X0 v* g) A1 z
// list from timestep to timestep; m3 k; L! x4 D6 K$ x6 I
- A7 G o3 U, U2 [0 ?7 y // By default, all `createActionForEach' modelActions have
' T" U s5 `7 l // a default order of `Sequential', which means that the6 e0 [" _* \- \' Q
// order of iteration through the `heatbugList' will be1 H" c& ?; f' c; |1 ^% p' [
// identical (assuming the list order is not changed" T( Y+ o& @' }2 ~) S
// indirectly by some other process).
& Q. m+ `3 `) J8 }: x$ _. b
" X2 Q0 a% T4 {/ O modelActions = new ActionGroupImpl (getZone ());) x' m l( R# m, W: L
0 B% A9 Y' F1 Z4 f
try {) l, _' i$ A; H
modelActions.createActionTo$message
4 S5 b+ d0 G8 J) B, E (heat, new Selector (heat.getClass (), "stepRule", false));1 H) I6 x) n' B) J$ U
} catch (Exception e) {1 o1 q6 Z9 u, z, G; K+ n6 b
System.err.println ("Exception stepRule: " + e.getMessage ());
! S5 v. q2 p9 W8 i% X8 j8 q- f5 j }9 }) Q* H: H0 d! l( V2 X
! B% O: p, X; ?4 i
try {
/ K6 g& o2 X: H9 |2 [& n Heatbug proto = (Heatbug) heatbugList.get (0);- p( U; q0 |2 c! o: c7 A/ i$ s
Selector sel = * y4 u: b7 M( m
new Selector (proto.getClass (), "heatbugStep", false);0 `* y! h* o" G( ^8 y& V8 d5 q
actionForEach =
8 Y. B- R5 h9 C2 z) z modelActions.createFActionForEachHomogeneous$call
, X4 N, M: x( e& b2 U2 n (heatbugList,
, w/ {/ f! t6 k: \6 O# a1 \ new FCallImpl (this, proto, sel,
) j4 ~& y! ]& K: ^3 k' j) p new FArgumentsImpl (this, sel)));; L7 d% s3 w" j4 T+ n9 \ L/ o
} catch (Exception e) {7 C9 Z$ u: K- D) s. [) H s6 }
e.printStackTrace (System.err);8 B5 }9 M) C& l/ K# O# x
}0 M! F9 p; a: D( Z
* r% I8 G3 U' y syncUpdateOrder ();( t2 }# G, h" B" j
! O6 F/ s5 e( C& ]" V% J
try {/ t! G5 [* [ ^+ H
modelActions.createActionTo$message
7 B# @' ]! ]7 S; O9 R3 g9 b (heat, new Selector (heat.getClass (), "updateLattice", false));
$ Z+ ]: i3 g X' K; o! _) s: k6 ?5 a } catch (Exception e) {
/ z5 X! Q9 |7 m9 r: U System.err.println("Exception updateLattice: " + e.getMessage ());
8 ?* ]# C- z$ t }8 s' \( i4 o9 l0 s1 d) o/ o
3 Q8 O! Q! Y8 i$ F" [7 m& ~ // Then we create a schedule that executes the
0 ^, S7 q' N, L! h' ~ // modelActions. modelActions is an ActionGroup, by itself it. m* H: v4 \! C3 ?) s0 C
// has no notion of time. In order to have it executed in. a9 _: @1 r+ X1 Q& M) l5 k% h
// time, we create a Schedule that says to use the
. Q# q/ m% b" C8 i* m4 J, I7 [ // modelActions ActionGroup at particular times. This
! m7 A7 b2 K3 s6 ~- f- E H // schedule has a repeat interval of 1, it will loop every! s2 A% v# E* W( D
// time step. The action is executed at time 0 relative to
$ |; W( t3 f8 `' }2 z6 L // the beginning of the loop.
6 N1 j5 ]3 u& f6 U6 ^ d
% u6 O5 ]$ E9 U# z$ t n0 I // This is a simple schedule, with only one action that is
2 d/ |( ^) P# |" h# y+ J# l8 f // just repeated every time. See jmousetrap for more
8 i7 q3 @/ |3 ?( J# [" ~# G: V // complicated schedules.
9 P4 D, u R' Q6 q3 Z; ` " G$ m* o' d3 Y4 b
modelSchedule = new ScheduleImpl (getZone (), 1);
8 X f$ N$ g8 i- E$ F" Z% ` modelSchedule.at$createAction (0, modelActions);/ e6 Y: \# d$ ~& J
% M+ F$ s# O1 b% @ return this;3 L4 {% g b8 w, w
} |