HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:/ d. b# s5 U" B# w$ e& E6 @
4 ]% ?1 y% d# e5 g3 c public Object buildActions () {
7 C( w6 v* ~5 u' y3 t$ N1 \; o2 D/ \ super.buildActions();
* W% D% J$ x9 e v2 I
$ ^4 f5 n6 T( [1 u2 H // Create the list of simulation actions. We put these in5 H/ m. `& H& U7 G1 P; M# j
// an action group, because we want these actions to be
* M _$ A$ G1 y. R- x" D // executed in a specific order, but these steps should2 B' \: Q0 Y9 a. Q5 y0 g9 P7 K: D
// take no (simulated) time. The M(foo) means "The message
; J/ W$ I/ S5 g, X* z/ M/ n // called <foo>". You can send a message To a particular+ ^0 e7 Z1 ~8 W5 l, k% d/ Z/ C
// object, or ForEach object in a collection.! W2 ?# G7 B: z+ ?8 f0 w& _2 n$ y' M
2 I: U$ u# d& O6 ?7 m4 C // Note we update the heatspace in two phases: first run
$ c# y" n& P% S" {/ t2 [6 X5 K2 U# ` // diffusion, then run "updateWorld" to actually enact the* C- I4 p7 `& @
// changes the heatbugs have made. The ordering here is0 R% d( P, P( e1 T
// significant!' x4 w& d* Y. k- L* V! Q
$ g# l2 w6 a) @6 @+ u: c* i // Note also, that with the additional d6 s R0 C% b/ S1 b& l; P
// `randomizeHeatbugUpdateOrder' Boolean flag we can
" ], C% |0 W! A$ p+ s% Q% ~3 e% x( N1 g // randomize the order in which the bugs actually run7 u: |1 U3 }! ^" x- [5 a6 x$ ^
// their step rule. This has the effect of removing any6 D, p0 _) E! b% y' n4 j
// systematic bias in the iteration throught the heatbug8 ]/ H6 G3 W/ C7 f! v. C o
// list from timestep to timestep
; F2 O0 n* a% g/ ~ $ u' V# h& S1 V8 k; f/ H" Z
// By default, all `createActionForEach' modelActions have: v ?6 z+ h! Y; T* y4 q
// a default order of `Sequential', which means that the. B+ A* M5 `4 y" u1 U
// order of iteration through the `heatbugList' will be! o. K0 e; y v7 H$ b7 {1 \
// identical (assuming the list order is not changed# l; N6 h- w3 Q1 W4 V
// indirectly by some other process).
: w5 z. _+ G7 ^, z- {/ K- K& C+ M
3 \2 C4 \+ S5 s+ E. I; \ modelActions = new ActionGroupImpl (getZone ());& N0 p) ]9 e" {* L
. M* Y! l5 O0 f) U- }* D
try {
6 [+ m, `* E1 [7 x- w& c modelActions.createActionTo$message' L8 k: a7 C/ Y+ ?) E0 k. | J
(heat, new Selector (heat.getClass (), "stepRule", false));
1 \' P M8 J) y5 g0 c } catch (Exception e) {
! B+ P% |' }1 {6 Y2 U3 R" P/ } System.err.println ("Exception stepRule: " + e.getMessage ());
1 v& U1 [3 s" E0 Y. `% M }
2 c! E" f2 g: t; P6 s, f
9 z2 b1 c; n# e0 p! W/ u try {
8 O; j* j) g8 L: x2 p$ X Heatbug proto = (Heatbug) heatbugList.get (0);
9 J. m; Z" M p! E# Z' X Selector sel =
( i6 m2 P8 Z, |) V& Y new Selector (proto.getClass (), "heatbugStep", false);! ?' J5 a: o9 k! B7 @' V4 E9 Q
actionForEach =
* Q5 W8 O+ L! ]; c5 O modelActions.createFActionForEachHomogeneous$call
# y+ x( M. G9 c) |7 N (heatbugList,
9 E" g) k; r5 y6 M! Y4 z" Q- @, ? new FCallImpl (this, proto, sel,
+ [ ^* A3 e& G, q new FArgumentsImpl (this, sel)));
, G; x3 n/ b; u$ \9 k( n7 @7 q } catch (Exception e) {& g: j, ]. R0 J2 p0 Z$ C
e.printStackTrace (System.err);
: q$ S" z, _8 ?" c$ ^ }+ e5 E) i1 O* ~& f0 u
' R! W/ f2 Z2 a8 D ]' g syncUpdateOrder ();: r' a6 c0 E0 ^5 f! V1 K9 G
% {% U5 ]( S9 w- M" }& O7 S
try {
6 {# G+ J. H4 z+ T modelActions.createActionTo$message & g/ T: {8 p6 N5 Z; f9 H
(heat, new Selector (heat.getClass (), "updateLattice", false));$ Q: l* B' Y5 C0 J3 C
} catch (Exception e) {
7 U+ X$ k* ^* w( p System.err.println("Exception updateLattice: " + e.getMessage ());9 e. n3 I7 P" l: z6 k
}2 ?0 F: B7 E) v) G
) ~( j, M' O7 {9 z // Then we create a schedule that executes the
. B# t5 _% f- t // modelActions. modelActions is an ActionGroup, by itself it' g. V2 i& U2 D8 d; [6 s
// has no notion of time. In order to have it executed in
+ a, W8 P& e0 I. ]: u' v // time, we create a Schedule that says to use the' i2 C+ u/ p# Q7 w+ V
// modelActions ActionGroup at particular times. This) h7 M0 g0 j9 V; y% w
// schedule has a repeat interval of 1, it will loop every( ~) E9 y+ e2 s7 D* p6 i
// time step. The action is executed at time 0 relative to
8 q/ N: M9 x7 n( B9 H // the beginning of the loop.- S5 M6 Y% E, ^
% S# A9 F- Y( G( W- ]4 I // This is a simple schedule, with only one action that is% i* @$ N3 e1 W2 a$ i) X# {# K
// just repeated every time. See jmousetrap for more
( F/ O7 P" x7 A6 ?" I // complicated schedules.! y, U7 Z2 X0 U
, y4 W* j& r! D! u) j) y {! l. U modelSchedule = new ScheduleImpl (getZone (), 1);7 }$ B+ h! J. M% ^
modelSchedule.at$createAction (0, modelActions);5 b [2 Y4 v! {( V- \% L
9 Y. z, W0 b' z* Y return this;
% U) L6 |( }8 b5 t } |