HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
5 ~2 M8 S, O) f# z; D
: ^ m' G! {1 Z4 w# f/ t* Z public Object buildActions () {
5 @; E. p- C7 A6 k. f super.buildActions();
3 S- w& }" Z# f% z( v7 g . O+ d% q' e$ L' F. J6 Z
// Create the list of simulation actions. We put these in$ E, i2 ? r) D/ G4 ?
// an action group, because we want these actions to be! w U" [; f+ h9 t( [+ k4 e
// executed in a specific order, but these steps should! R5 @& m. I9 b: d: z
// take no (simulated) time. The M(foo) means "The message
+ E6 F4 f" o8 R% T/ W; i // called <foo>". You can send a message To a particular
( c3 ]# N7 p# x T; K // object, or ForEach object in a collection.
$ ~" I: l( i! ?! w3 r $ |+ D9 B% r; F0 G! w: l9 u7 M# j
// Note we update the heatspace in two phases: first run
% M0 w: }3 H& Z0 U2 a* @ // diffusion, then run "updateWorld" to actually enact the
, ?# k3 u( |" h' K" p4 P // changes the heatbugs have made. The ordering here is, [0 C* K2 U. W- u2 S ^
// significant!
. n t% R3 o/ d- V0 ]
! M. \4 x& S2 N- O // Note also, that with the additional
& V% B; x) q' `3 |) p // `randomizeHeatbugUpdateOrder' Boolean flag we can) f' |6 J; _: ^9 A% L& l3 ]
// randomize the order in which the bugs actually run
Y' t: q! Q; e5 \; Z // their step rule. This has the effect of removing any# @( k) t' m T+ t5 Y# I
// systematic bias in the iteration throught the heatbug+ u% o0 W0 L a- f( R
// list from timestep to timestep# `7 w& p% V6 O6 z
. {/ T8 p( X& W, f# S
// By default, all `createActionForEach' modelActions have
& O7 t0 b/ E! a" E$ U( c3 }, b7 | // a default order of `Sequential', which means that the3 ]3 X. I4 w0 j: p$ ~& F% y
// order of iteration through the `heatbugList' will be$ j6 l% M( }: ~. ]; R$ x! \
// identical (assuming the list order is not changed3 g8 f( l& ?5 l& j- M
// indirectly by some other process).5 f4 V$ f" g' F9 N* ~
( C; N6 k# X8 V modelActions = new ActionGroupImpl (getZone ());2 F; |- ?. { A4 j, Q1 Y: ^
% a/ b# x' }) g& Q$ _1 T try {0 Z" h( P8 `+ U. C
modelActions.createActionTo$message
$ b3 x# Y1 H# E8 W2 b) T( T) ^: ~ (heat, new Selector (heat.getClass (), "stepRule", false));
; U$ \/ K, m& j/ I2 K, ?! M } catch (Exception e) {
1 X! H6 w* |. K7 W8 ~9 e9 i G5 y System.err.println ("Exception stepRule: " + e.getMessage ());
; y: G! r6 v( G) A& m! |: T$ x }! G2 \; P U" e- a+ O7 E
/ C3 M4 M8 ^2 x; X0 Q" r. f1 y7 q
try {
; \7 t6 [2 N8 Y. c' l7 k; p Heatbug proto = (Heatbug) heatbugList.get (0);5 a3 I/ l: F: u) K. q$ V9 e
Selector sel =
. v* _2 N& t6 y$ I" ? new Selector (proto.getClass (), "heatbugStep", false);/ Z7 e! w! G2 f$ n' k3 O8 |
actionForEach =
# K) y1 V3 a. o* G: O modelActions.createFActionForEachHomogeneous$call. E4 | Q% R O. U1 `, T0 N
(heatbugList,
+ T0 S) U0 I) h new FCallImpl (this, proto, sel,* k: v; [- _: o1 u/ G7 ~
new FArgumentsImpl (this, sel)));
, L( \5 A6 \; W5 `7 l3 [$ r } catch (Exception e) {
2 M( y7 N D* h e.printStackTrace (System.err);' I1 G: m6 B- P. x5 ]' E# g
}, H; h0 E/ n! D) i+ \9 n
6 d7 s; X0 H* r7 D% g. K% f; c
syncUpdateOrder ();7 }3 J/ d5 T1 N+ J
( Z9 {3 ]4 _ M5 K: L. K+ l' S try {
+ j% O: R* L/ r. `7 w. @ modelActions.createActionTo$message % I: }$ Y; q; a
(heat, new Selector (heat.getClass (), "updateLattice", false));
7 v, v1 X9 [; _) z0 P } catch (Exception e) {
/ U/ s7 q8 J& I- _ System.err.println("Exception updateLattice: " + e.getMessage ());9 ?7 B1 J7 r! E1 r- i
}1 M b% D$ p/ V1 {: x( q
1 w( c s) O8 ?( ^1 \5 | o- E // Then we create a schedule that executes the1 Y3 R5 L) W1 w* b- R
// modelActions. modelActions is an ActionGroup, by itself it+ G; ~4 y" T' a! l4 I. f
// has no notion of time. In order to have it executed in
. P4 t* b4 c! S3 m4 u6 H+ e // time, we create a Schedule that says to use the6 {+ X+ Z! ]/ y% k& u
// modelActions ActionGroup at particular times. This" v! T: Y" D: }( L
// schedule has a repeat interval of 1, it will loop every
]6 S2 N# j' f0 |( t2 C9 I // time step. The action is executed at time 0 relative to5 J" s( p4 @! M' R3 Y
// the beginning of the loop.
8 j6 y4 J3 k# F( Q# D& q
9 T# [* ~# j2 h' |) ]* R6 z: i: R // This is a simple schedule, with only one action that is
' F7 g/ c1 l4 K // just repeated every time. See jmousetrap for more0 G4 w. _1 S! k
// complicated schedules.$ s/ K. L1 V; e' u% _0 x
- a! Z+ {% E1 `5 ]- t1 P' o
modelSchedule = new ScheduleImpl (getZone (), 1);
( D1 X% L% _; R' N' t8 Z5 T! l6 q modelSchedule.at$createAction (0, modelActions);
3 L: e5 R/ C4 ] u. A / U u. X: ~8 z
return this;
" a$ _: e" o( P8 q6 A6 k8 Z } |