HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:' c( f+ K( @% ~ n, W& x: o
; r% A. H1 D+ H+ D! s7 }9 a public Object buildActions () { s% P: Q6 m2 h! e: a1 i7 q
super.buildActions();& H; y: K! X- d* G; I5 _, R
}. F' B* S; o; h3 @2 S8 u5 f* p // Create the list of simulation actions. We put these in
, x2 Q$ |5 x6 a- C& Q0 Z // an action group, because we want these actions to be- B8 w( a. _& \
// executed in a specific order, but these steps should
; z# Q8 O" j1 p3 Y' u // take no (simulated) time. The M(foo) means "The message- T! f: y- d7 k+ |& [3 f
// called <foo>". You can send a message To a particular
/ f2 E7 G0 C7 i/ \1 q$ S // object, or ForEach object in a collection.
- s; r8 l. S* k! O/ `* I. F
" S8 L0 j1 k# i/ U# {- t; Q2 X // Note we update the heatspace in two phases: first run4 A( o p. b2 V/ C* t' l' D
// diffusion, then run "updateWorld" to actually enact the
6 y. p! u/ m0 q8 w) ^7 } // changes the heatbugs have made. The ordering here is; Z1 F. n7 d1 a( s) t
// significant!9 a/ z. _! Z7 x, d! ?3 e2 Z1 _% R
' A# F- O6 }3 \% n( D, q6 n( C: e% s // Note also, that with the additional0 t0 E* A9 x8 [# ` d a- n
// `randomizeHeatbugUpdateOrder' Boolean flag we can
$ q4 y$ ]2 _ A$ p3 F // randomize the order in which the bugs actually run/ P- h* { D7 X5 d# z
// their step rule. This has the effect of removing any# P- n2 ]8 M7 T" n+ j* W3 ]- f% {- K: X
// systematic bias in the iteration throught the heatbug$ A+ g# g$ r- O3 ^4 q; b
// list from timestep to timestep
7 p0 I" l/ Q" I7 p+ l8 V0 b 1 |" U" c" O, L( L
// By default, all `createActionForEach' modelActions have
* Y, ~3 w2 m" {0 ?% f' U1 z; X // a default order of `Sequential', which means that the: b4 |3 N" k+ w- T- {- N1 j
// order of iteration through the `heatbugList' will be
. R" d+ `/ W: w3 Q! X // identical (assuming the list order is not changed
: o# q4 {( P. U9 X& L" D- H // indirectly by some other process). ]4 p f$ x7 D+ {
+ V0 v" O# v6 t6 t6 h
modelActions = new ActionGroupImpl (getZone ());
. r+ z) n- a) F' u1 z4 l
# Q# D7 e. V6 Y+ k% L, V try {
, k0 d3 {6 `& U/ u& D% Q: v2 w modelActions.createActionTo$message
8 c3 \( G) W8 q( Q: t (heat, new Selector (heat.getClass (), "stepRule", false));
1 c9 ?* ]/ g }: I5 ^6 s: K } catch (Exception e) {% ` h9 Y, m4 V' m7 W& j# ]2 B1 s
System.err.println ("Exception stepRule: " + e.getMessage ());! C f* s2 v, ~% ~) x
}1 N7 j# J2 Q9 {$ ` z4 f4 [; i+ c6 ~
6 u8 k) B8 A1 ^! O( s2 E1 e; |
try {2 \) p: o8 Z7 ^3 q
Heatbug proto = (Heatbug) heatbugList.get (0);5 a# x- y) ]- k7 Y: g
Selector sel =
/ \3 R' D% F. t new Selector (proto.getClass (), "heatbugStep", false); o! ^' C" a1 Y, |
actionForEach =
: l9 `1 @) ]# Y" d: N9 ?9 r+ Z modelActions.createFActionForEachHomogeneous$call1 M8 s- X+ y& e3 x* g
(heatbugList,
& y& F% o @! F1 |: F1 Q new FCallImpl (this, proto, sel,
U: m# ]6 V2 b3 o- [9 g% s/ A! |/ W new FArgumentsImpl (this, sel)));
6 q/ h \8 W' t" t8 b8 q* b } catch (Exception e) {* l# @1 Q" M6 s
e.printStackTrace (System.err);/ v. N0 j( M, [$ B" G/ U" G. T9 u
}0 Y8 U" i7 q8 g3 y! u0 Q/ s+ C6 Q- _
, b0 W3 P2 w) O/ e( g. L% G
syncUpdateOrder ();7 J& P: W$ g2 W% J+ s9 q# u- z. L
- o! _% `/ ]3 \
try {
/ D9 X) t& E; y; { modelActions.createActionTo$message
7 v+ V V; j( O: F (heat, new Selector (heat.getClass (), "updateLattice", false));
! e" J( p- c+ ]' R, \7 a4 L } catch (Exception e) {5 _% r i& B" u: G; a; }8 f4 r- _
System.err.println("Exception updateLattice: " + e.getMessage ());# |1 E! ]# d: ^+ N6 u: P" c3 X
}1 h( ?( B9 a' T8 p0 `
2 |4 a/ g: V5 h3 w5 {% W
// Then we create a schedule that executes the
+ ~& Z: u3 Z& V // modelActions. modelActions is an ActionGroup, by itself it
5 j9 Z) h, W. ~6 l' } // has no notion of time. In order to have it executed in
& Y" M0 {/ }! Q/ Y* j // time, we create a Schedule that says to use the
1 ]+ u* r* r5 i+ z2 u; { // modelActions ActionGroup at particular times. This
( _- @; F/ B! A) `- Z7 e // schedule has a repeat interval of 1, it will loop every
^) d2 S! R" u3 H // time step. The action is executed at time 0 relative to
' f& n/ X; h( k: I // the beginning of the loop.
5 h" s* D- e1 d" |* d% u. t" l0 y) n7 P2 z3 ?
// This is a simple schedule, with only one action that is9 C) m3 a& w" I- g9 q
// just repeated every time. See jmousetrap for more
& J+ z, v9 ]/ N6 X // complicated schedules.
, B9 F# I: K5 ~3 `1 C0 K& J: i 2 K# s# E0 Y3 s# b" C3 G
modelSchedule = new ScheduleImpl (getZone (), 1);% M# q( m, X" D; {0 ~2 r+ \
modelSchedule.at$createAction (0, modelActions);
' o8 C q$ u9 @, t& ~- ` 2 F1 u% n! ?$ f# w* A: Q
return this;
1 { ?' m# G4 ~! R+ K' X: F3 T$ | } |