HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
1 g- N* } ?' J( j2 p+ G
4 ~4 o$ i3 p( P public Object buildActions () {- t; {" Z2 n2 o+ W( w6 ~8 |
super.buildActions();
. e1 x# u% s$ F/ ]: q0 C6 N ; M. m" {$ z$ w* P3 O0 p3 `9 Q5 h
// Create the list of simulation actions. We put these in) {, Y( y- J: i$ G- P! J
// an action group, because we want these actions to be6 z- x& v% v/ A/ m& m; k) U( d
// executed in a specific order, but these steps should
5 C8 s' B: ~0 B v# G0 y // take no (simulated) time. The M(foo) means "The message
' S; z+ u: V. p0 d0 ^ // called <foo>". You can send a message To a particular
5 Q+ g+ H7 a' q8 l // object, or ForEach object in a collection.3 j7 V [% }3 V" u) u1 }
# K, d+ l4 G" g: B* V- [& |2 }' F
// Note we update the heatspace in two phases: first run4 a0 B+ c) N* j3 V4 n8 \1 z5 ?) M
// diffusion, then run "updateWorld" to actually enact the, c& d6 M" v1 k. d5 `$ P
// changes the heatbugs have made. The ordering here is
6 D$ y4 u: w$ J* ]( ^$ [. p // significant!
5 b f5 P# o! ?5 ` / a- o4 ^1 T3 v1 B0 S- Y
// Note also, that with the additional
) K( l# I& x @" W1 U, Q // `randomizeHeatbugUpdateOrder' Boolean flag we can, E0 l0 U& i* G( r/ Q# U3 @- M
// randomize the order in which the bugs actually run( |% `* k2 T/ @' ?! O' i4 ^
// their step rule. This has the effect of removing any+ L; r0 V# _- C3 Z$ y4 [
// systematic bias in the iteration throught the heatbug* V! ~4 G6 @; l! V9 _
// list from timestep to timestep
4 e- |. s* i- [8 B
& }- g3 ` q5 u& v( R7 D // By default, all `createActionForEach' modelActions have+ ^ i, |5 P& F4 h, [* C, `8 p0 M- l
// a default order of `Sequential', which means that the1 A4 O+ D8 i) P* L5 w3 R; X& u
// order of iteration through the `heatbugList' will be
; N+ t7 Q" F+ j0 F2 z; _% ?: c // identical (assuming the list order is not changed) K; ?) r2 w- H7 W! M& x: m
// indirectly by some other process)., ^0 b( x; [1 u4 l# i, _8 h
& A. _. W; |3 B modelActions = new ActionGroupImpl (getZone ());1 h4 M* T% @$ s% q$ [1 i
2 X' N4 w& l Q try {7 B! V8 z/ E5 `9 o! E
modelActions.createActionTo$message
' p: }- r# M6 c# F* v8 m1 Z (heat, new Selector (heat.getClass (), "stepRule", false));. q: b- `& L7 O
} catch (Exception e) {* ~- x% H5 J. H: G
System.err.println ("Exception stepRule: " + e.getMessage ());; K P; o0 ~5 u M
}( O L" U+ S- F" N' i
. U8 K* J) J4 Q9 H8 n! @0 F
try {" a7 ? w* f$ g/ U( }' c
Heatbug proto = (Heatbug) heatbugList.get (0);' a4 e4 @3 C/ Y2 A. D9 X* m
Selector sel =
2 j# A1 u8 v8 M0 v8 q* I" x new Selector (proto.getClass (), "heatbugStep", false);
0 ~" G$ ]6 H# Y0 C actionForEach =
. D t" a0 Z! J# j1 ] modelActions.createFActionForEachHomogeneous$call
1 A0 _- _* g8 s3 Z (heatbugList,
" _/ u9 v3 V% \8 g7 ` new FCallImpl (this, proto, sel,2 v2 ]. b- c% m+ i: i
new FArgumentsImpl (this, sel)));
& M% j* w7 s5 R" k } catch (Exception e) {
# D/ v% Q0 S0 n2 _: t e.printStackTrace (System.err);
: E* c# n, D9 \1 P. ?. F8 p; _# t }
; G, A' s# {" t$ C6 o , h( V+ _" X! L! l
syncUpdateOrder ();1 @( G6 m+ j% e |4 A
# d# z4 I: @+ e: a* q try {
6 J1 l0 `& {$ j, G' k modelActions.createActionTo$message
3 l6 e* \5 M; {* @5 a4 K2 G8 L (heat, new Selector (heat.getClass (), "updateLattice", false));
% h& Z4 p8 ~5 m* A5 H } catch (Exception e) { p- q6 e I, w% i8 |6 s
System.err.println("Exception updateLattice: " + e.getMessage ());! }6 n( [ U+ C
}2 E- h" ]" R3 T( m9 p4 Y* ]* D
! k4 h9 T( \. F3 ^ // Then we create a schedule that executes the
% e; { ~: A O8 d // modelActions. modelActions is an ActionGroup, by itself it
! d0 d( a0 _* t1 i% ^ // has no notion of time. In order to have it executed in x, j$ b) P; U0 w% H/ _
// time, we create a Schedule that says to use the* s8 |% L3 U0 Z6 {) p
// modelActions ActionGroup at particular times. This
6 n. V' e+ L9 r% S; s/ E; b // schedule has a repeat interval of 1, it will loop every
! A- |" H* o! k- [: h+ k/ c* m // time step. The action is executed at time 0 relative to& `0 z( H: A& z1 o
// the beginning of the loop.
S5 Z& b; l" ~4 \: d6 Q
1 j- ^: }7 Y; L6 [ // This is a simple schedule, with only one action that is4 Y' m- a- ~( g C& F$ x
// just repeated every time. See jmousetrap for more6 c, y; c% o$ o4 d u" u7 o( l
// complicated schedules.. i5 L' ^, I. h( t' P
8 M$ s; P# t& @/ j modelSchedule = new ScheduleImpl (getZone (), 1);$ R$ N$ b$ F5 v B
modelSchedule.at$createAction (0, modelActions);
9 w2 c- j& O* q9 h) x6 B
* d# d5 E D6 ?0 T return this; \# p6 k# v; R
} |