HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:; C# [ _- }2 R8 j4 @
: T4 A" C3 o- U/ ~6 n3 _% f0 i public Object buildActions () {
- j0 A# G3 @8 l3 z& b. F super.buildActions();
; o7 n) C# F. _( l0 c' g4 _# S
# s- o& s" L' P9 g# T // Create the list of simulation actions. We put these in
6 [; q1 Z$ I& _ // an action group, because we want these actions to be) D; s f8 u7 P8 |6 s$ m
// executed in a specific order, but these steps should( p2 o/ k5 E6 l0 e" m. u# F
// take no (simulated) time. The M(foo) means "The message$ P/ f4 @' N* w
// called <foo>". You can send a message To a particular; I/ ?- E+ s9 t! W: ~3 V
// object, or ForEach object in a collection.) ?" x" @( O) n- y t, |: [3 ?: w
* B. p" R- k! E8 [/ U+ w
// Note we update the heatspace in two phases: first run
2 J/ s$ q% x( ^5 s: p1 Q, o% ^ // diffusion, then run "updateWorld" to actually enact the( ]! m$ k5 C7 y# Y' m" y
// changes the heatbugs have made. The ordering here is
9 K9 _4 \( @, q0 R/ l: ^ // significant!
( y9 { M* }7 k7 A % G2 L3 W/ l/ F8 G7 f
// Note also, that with the additional
4 E! E2 |" G5 [- N- s // `randomizeHeatbugUpdateOrder' Boolean flag we can! l. ^9 e$ k- E' P, J& A# `
// randomize the order in which the bugs actually run
. G: E& E5 D! ?6 _1 A1 H8 [ // their step rule. This has the effect of removing any
6 Y: `( ^* a; m4 P# N // systematic bias in the iteration throught the heatbug6 G) {3 i1 X! [+ i
// list from timestep to timestep
1 n; o# y! |% L } - v+ \" \- m# I0 E/ [" K
// By default, all `createActionForEach' modelActions have# t% f3 Q' [. X5 _( ]0 u' a
// a default order of `Sequential', which means that the" V9 r9 T* b$ ]5 q" G
// order of iteration through the `heatbugList' will be$ U% T+ ?8 S0 [& x' `1 t% {/ i
// identical (assuming the list order is not changed! Q1 p; @1 I4 s% h! t3 w3 F r/ i3 y
// indirectly by some other process).
2 O: V. o+ @2 U' \
" Z) e3 N! d2 E: K5 S, ^$ g5 e modelActions = new ActionGroupImpl (getZone ());
9 p( n5 U' k- [. I+ \7 g" T, N" P; J( I2 h
try {
; N- r; `9 K( f9 f2 c) z modelActions.createActionTo$message
5 k6 ?. V7 v( R/ ?, ~# U* j5 y (heat, new Selector (heat.getClass (), "stepRule", false));5 t1 B- o" [3 e. p4 a
} catch (Exception e) {
m& j) ~+ l4 |9 |! U System.err.println ("Exception stepRule: " + e.getMessage ());- @: ]$ s/ d( T0 S
}( o6 G* v( m6 _
/ \/ Z3 K& A' k% g$ Y try {
2 s* q8 U) w& e ] Heatbug proto = (Heatbug) heatbugList.get (0);7 n# K$ ^ V# Q5 q& ~1 X5 g& Z
Selector sel =
2 D8 \& B6 d4 u* t new Selector (proto.getClass (), "heatbugStep", false);
1 A2 A, s0 {/ K+ [ actionForEach =
( c8 `4 Q$ Q8 H& A- \ modelActions.createFActionForEachHomogeneous$call
3 G9 S& ^$ W, G3 M (heatbugList,
7 g9 [1 B% l! i# S# H new FCallImpl (this, proto, sel,
7 C) y( o" H- _+ o! O% f new FArgumentsImpl (this, sel)));6 L* H7 U- C; g' {; A, p3 k
} catch (Exception e) {
! l- [3 D# p' g. X; a e.printStackTrace (System.err);/ |8 e' O! @; r! e
}+ S( A" q1 E' k, \% Y
% q" d/ J# y" a' P! ?& m syncUpdateOrder ();: i, K0 ^, e0 m5 d
- \! o7 b6 T$ a1 J- h try {
( Z" P3 c5 n) p8 U; s modelActions.createActionTo$message 9 P9 \8 ?9 Y& ^ ^7 @# i z
(heat, new Selector (heat.getClass (), "updateLattice", false));
+ j/ t( @ C2 P, H } catch (Exception e) {
4 ?2 W: Y0 l2 R$ r0 Q$ Q( n System.err.println("Exception updateLattice: " + e.getMessage ());' s% X3 Y9 b% @+ ~7 E
}! }1 M6 P. A9 z$ q% w
+ D5 ?& w2 B0 r
// Then we create a schedule that executes the
: D2 d! j# B5 k2 u0 Q$ O // modelActions. modelActions is an ActionGroup, by itself it
( H( O) T8 i) Z" C // has no notion of time. In order to have it executed in' p5 K' a% ]8 s% s
// time, we create a Schedule that says to use the9 f8 f! b, x+ j$ Y
// modelActions ActionGroup at particular times. This3 G. P- D' b" }# u! x$ d
// schedule has a repeat interval of 1, it will loop every& L! M0 i$ _7 k2 A4 T; z
// time step. The action is executed at time 0 relative to
: i6 p3 j6 N9 B; A+ W8 o- ` // the beginning of the loop.
' |6 S/ a% Z+ B9 q+ E4 F2 O3 R) t
+ q$ [7 C7 D3 A1 e j7 u# J. u! X! m // This is a simple schedule, with only one action that is \; [5 j; l0 R6 `, P( M- R$ [
// just repeated every time. See jmousetrap for more2 B, E0 E1 O2 K
// complicated schedules.& ?3 U: K3 |6 X! H$ M
9 g$ M4 q5 R) z
modelSchedule = new ScheduleImpl (getZone (), 1);
]$ j" l# K, f( m modelSchedule.at$createAction (0, modelActions);
) j z: I5 o2 t/ _ ( ~% ` } ]: n3 j* k
return this;
. s# H6 A7 v' ?: \8 i- H4 Q i- Z } |