HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
]2 U9 Q0 g( n! f; Y: w/ J2 ^
9 l4 p2 m! h0 j+ f \! b3 D- v public Object buildActions () {
1 A% d2 L4 K1 n/ r; S. S9 u# p super.buildActions();% c& z, e1 D1 O0 n- E* v) u8 {$ U: q% [
/ S1 i/ V% Y! b/ H/ d4 K // Create the list of simulation actions. We put these in9 I; M8 `6 R7 m- ^. O, y
// an action group, because we want these actions to be+ R! L n. H5 O% W3 H
// executed in a specific order, but these steps should
* g2 |, b& m: D6 F: X2 F // take no (simulated) time. The M(foo) means "The message; O/ U. v/ m# ?# U$ O+ Q( N
// called <foo>". You can send a message To a particular% @# H4 J$ J7 B* h
// object, or ForEach object in a collection.: `* m: @9 _) Y0 u2 K* @
' ~, b5 p5 F" @; H: E8 Y
// Note we update the heatspace in two phases: first run
2 i5 h' X! L# p9 W( p! F // diffusion, then run "updateWorld" to actually enact the
' u. g6 O w8 p$ k // changes the heatbugs have made. The ordering here is' [% ]$ s( h8 H3 i% A6 Z9 k0 K0 F
// significant!- Q% Z) a& r3 L4 c4 r5 n
8 \4 k/ T9 l8 w // Note also, that with the additional3 Z$ n) `& @! u' m0 U. e" q
// `randomizeHeatbugUpdateOrder' Boolean flag we can @: U8 U# l ~" P E& i6 x' |
// randomize the order in which the bugs actually run
' C7 S+ J* `2 l% u# k8 V7 z( | // their step rule. This has the effect of removing any
* I- Z! {6 F/ {- _" f6 o0 V3 z // systematic bias in the iteration throught the heatbug! C9 d& w) b) Y" R3 q w* |
// list from timestep to timestep
1 D% s+ k! Q" |0 f2 v; R6 J# i $ j: L3 T. }% h0 O$ @
// By default, all `createActionForEach' modelActions have0 g5 V. w' ^6 B# M& f, |
// a default order of `Sequential', which means that the) I. l, h# d O. L' f* O
// order of iteration through the `heatbugList' will be2 l4 a( R# d* l- o
// identical (assuming the list order is not changed8 d. u$ E. U: I! D) y! _3 b
// indirectly by some other process).
( F* ~' W- K& c" c0 f6 h 8 G4 j. o7 N1 p7 D4 {
modelActions = new ActionGroupImpl (getZone ());! F0 p* p1 S/ `: v% `2 [
) G$ g0 }% x' R& }
try {% G) s, ]4 v m& f6 {( Q6 i/ p
modelActions.createActionTo$message; Y+ ], k3 o# y$ E! s' m: P2 D* d
(heat, new Selector (heat.getClass (), "stepRule", false));- m+ R, L( r' S1 V" G
} catch (Exception e) {
3 L8 g' u0 g# h* U2 F8 L System.err.println ("Exception stepRule: " + e.getMessage ());% d, Q. J) w0 r4 C+ P& N4 F( ^" }
}
5 k8 }9 S( M: w! e+ X0 ?: K' N: ~6 [, W3 \8 B+ b: Z0 x
try {& L8 m8 C5 v" R% r0 ~4 n
Heatbug proto = (Heatbug) heatbugList.get (0);
! H, n; P8 Q- Z Selector sel = " s( G( K! y U( V
new Selector (proto.getClass (), "heatbugStep", false);: c: d& m( ]5 `% i( t- ] U
actionForEach =2 g i% `0 X9 ]6 \& H4 z& B, R
modelActions.createFActionForEachHomogeneous$call8 E) F" c2 M1 J( C7 B7 r
(heatbugList,* n4 B9 X1 s7 o0 u# S5 X
new FCallImpl (this, proto, sel,
- i- @! c1 j7 t new FArgumentsImpl (this, sel)));' [1 `! M. {0 f
} catch (Exception e) {& R e$ p: I# P, l1 l2 w( w- W
e.printStackTrace (System.err);
% Q8 o7 }- b0 B% r+ S }6 ]. E9 c- Y. O4 e6 D! ^$ w# ~; r
! u0 m( p/ S0 z/ ~; F6 T, K9 Y6 c
syncUpdateOrder ();! r% D! U* L; t, C( G, U
( x' P; ~ @, Z8 T, u+ q try {
( {5 G+ L0 j* F, U* c1 w8 R modelActions.createActionTo$message ) K& [2 _- p) @: J& H
(heat, new Selector (heat.getClass (), "updateLattice", false));' C0 W; x' j. K6 _4 Z6 G
} catch (Exception e) {5 G! K2 n, H0 W. ~5 b
System.err.println("Exception updateLattice: " + e.getMessage ());
0 X4 B8 i( x ?+ q( v2 i }
+ `& Z# k: U, s8 }$ h: v) V 4 d3 @, H/ R3 ^! ~. q
// Then we create a schedule that executes the
: a3 G" j* f: I- X2 {0 U" ` // modelActions. modelActions is an ActionGroup, by itself it4 c- Q; w; u7 x, B- l1 N4 P
// has no notion of time. In order to have it executed in
( G& h9 ~7 h# x; u; W2 a: Q- V+ V // time, we create a Schedule that says to use the
" Z6 O1 a: w/ a1 J // modelActions ActionGroup at particular times. This- s' e" g" o4 ]" W% k: S- p( n
// schedule has a repeat interval of 1, it will loop every
% c+ H' L5 O# @( |6 O // time step. The action is executed at time 0 relative to
, [1 k* }, \& F // the beginning of the loop.' R* D# s) r. u
: t; H8 C F: b/ Q3 \+ Q( {9 X' S' a' B: x3 w
// This is a simple schedule, with only one action that is
+ J0 K9 {- U1 R+ n1 d // just repeated every time. See jmousetrap for more7 B+ L" j5 u8 n& ^% K2 A
// complicated schedules.$ x7 S) B& W3 w' P D
4 a2 t4 d3 |0 r$ B* F0 _
modelSchedule = new ScheduleImpl (getZone (), 1);" `! L; n1 J9 B ~1 c
modelSchedule.at$createAction (0, modelActions);
* E2 P) U; F% ^; m: g9 t0 `
$ E- p1 u- F8 N5 x return this;
. D6 I1 }! w! |& ^5 z; A3 V } |