HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:* r& V& D/ W. y% I5 n1 K, c& n
* n! `' A; p8 l" X* a; x
public Object buildActions () {
& v* H" k$ N# R/ C/ D! d super.buildActions();1 |) p% x2 r! @9 |
- ]% _, Q( B- [, U( B. L4 t // Create the list of simulation actions. We put these in
$ M' r% X& ~5 @/ t M // an action group, because we want these actions to be1 Z& Q! s' ^: d( X! ~
// executed in a specific order, but these steps should
% j1 j. T2 X8 V4 K8 c3 S2 U // take no (simulated) time. The M(foo) means "The message
4 Y0 m: T) p0 B // called <foo>". You can send a message To a particular6 m, \. N3 t; X7 z+ {/ @
// object, or ForEach object in a collection.5 N! E7 U: l% e ?6 @, z9 H4 h0 [% N. }
( K4 H4 e) `2 I" r3 W) A! V. o6 f
// Note we update the heatspace in two phases: first run
& P# g f' |1 S/ e, V // diffusion, then run "updateWorld" to actually enact the
! W" v X# Q5 t* J5 M7 o, A // changes the heatbugs have made. The ordering here is
~$ z2 e g. R/ Q* f }6 P" |& G- B6 y // significant!9 B# w: r0 u) k( n
/ p; ^" {% B; {" U- F1 j4 G# _
// Note also, that with the additional
5 I( a v3 A1 N: t // `randomizeHeatbugUpdateOrder' Boolean flag we can0 N5 R) k3 a# X1 W/ M
// randomize the order in which the bugs actually run
z7 D2 D5 r2 p3 | // their step rule. This has the effect of removing any
# H' ^5 g! P9 E7 u5 C* z1 Y // systematic bias in the iteration throught the heatbug
; m0 ^& w$ C0 J // list from timestep to timestep; n6 P& \; j( @& a4 D) `- ^
/ |& I, P$ b1 V# ~4 r' C8 c
// By default, all `createActionForEach' modelActions have
2 l( |- O [! N7 z // a default order of `Sequential', which means that the4 w) _* @* r4 n) ?: @% z, b
// order of iteration through the `heatbugList' will be
, s* n0 j6 U6 V( D // identical (assuming the list order is not changed) \# [; j* i/ Q* @) q% n6 A
// indirectly by some other process).
% n' s5 T/ b" j+ _ , b, |+ N3 b+ t t. m+ D/ {
modelActions = new ActionGroupImpl (getZone ());7 i" H+ |% z/ d2 i- B5 d/ r
^, W7 D: e! N! p
try {
: x* b" N) p4 x" s modelActions.createActionTo$message
9 R; h8 @- V* C* ~3 P- O (heat, new Selector (heat.getClass (), "stepRule", false));0 V$ |4 w) d- t/ @: Z3 o5 K' p: v
} catch (Exception e) {
* {2 I/ H- {: I3 E1 m/ I System.err.println ("Exception stepRule: " + e.getMessage ());
C2 `! Z/ l9 i3 C1 L# {- n }8 a& L& u) z* ?' _0 o1 u9 u+ `
9 \5 U( \& ~) r/ a3 r" Q1 K0 L& g
try {
& k/ G' K5 h& @4 K" g x Heatbug proto = (Heatbug) heatbugList.get (0);- }5 r% s+ Z* D* h% I& w, z, }# D
Selector sel =
+ L" i+ S( G3 h new Selector (proto.getClass (), "heatbugStep", false);
/ F. u3 X, y9 ?7 A$ k/ h2 V actionForEach =+ T; R) h. F4 X1 W8 V0 G, ]; W% {
modelActions.createFActionForEachHomogeneous$call
; q4 Z0 D2 `! z, p6 H+ r (heatbugList,
% V8 o- a) j: Q. n; a7 f6 Q new FCallImpl (this, proto, sel,% I/ N# y, o( ~* w$ `- {5 w
new FArgumentsImpl (this, sel)));
6 x' c' h0 p, m0 @. o } catch (Exception e) {7 ?0 ^" y8 {" ]: y" a, ^, I
e.printStackTrace (System.err);% d3 \ m; A# J: c
}
/ ^" ]: ^- `8 P, y # W+ ?. B8 B* V9 S2 K
syncUpdateOrder ();
, T/ ~ ^6 ?: I0 K, Q
+ t& w* g- N& G Q try {
1 M" ^; Y3 r H modelActions.createActionTo$message
- T+ C) t5 J4 Q+ m5 o3 P7 A (heat, new Selector (heat.getClass (), "updateLattice", false));
. P/ U0 z3 D3 y } catch (Exception e) {+ I+ j+ @% z9 |" ^' F1 x/ @$ K5 g
System.err.println("Exception updateLattice: " + e.getMessage ());1 a& Z- L5 S/ C
}4 V5 H( u- |& L+ Q3 y' j! B
2 y) s6 ^/ ^* w // Then we create a schedule that executes the$ l" A1 }" s) p3 {( n+ j
// modelActions. modelActions is an ActionGroup, by itself it3 O2 [+ b3 J3 |- C2 o+ t( l" }
// has no notion of time. In order to have it executed in
! R" m+ W0 V5 z' M, [ // time, we create a Schedule that says to use the3 M. J. a5 [# ]) r3 M
// modelActions ActionGroup at particular times. This3 p- q4 W8 S5 @' I
// schedule has a repeat interval of 1, it will loop every2 P4 B! C* w( H, b$ @8 K y
// time step. The action is executed at time 0 relative to
& k; ]8 m' o* c# y* G // the beginning of the loop.
- U' \% F1 p3 L9 ]4 k- _
! B3 `! Q% B6 |0 u) y; E // This is a simple schedule, with only one action that is# f3 T) \6 ^! S" m! n' p0 t4 m9 t: u
// just repeated every time. See jmousetrap for more: {3 Q) w( @2 h6 P( t4 G5 Z: {
// complicated schedules.
! ]* F) t9 t* L/ @: _ : M- i9 q$ U" W+ A: D* T2 `* @
modelSchedule = new ScheduleImpl (getZone (), 1);( t( l6 g1 H# r' y q8 h1 s: f: \
modelSchedule.at$createAction (0, modelActions);! U7 L- ?' c; P' D/ i) k- U
. j6 u9 ]& D+ M2 q- H- K
return this;8 Y3 g! }/ S% n
} |