Mô phỏng của tôi đang sử dụng diễn viên và Scala 2.8-Ảnh chụp nhanh. Trong Java JRE 1.5 nó chạy tốt - tất cả 40 bánh răng (diễn viên) đang làm việc cùng một lúc. Sử dụng Java JRE 1.6 chỉ 3 bánh răng đang hoạt động đồng thời. Tôi đã thử nghiệm nó có và không có GUI: cả hai đều cho kết quả tương tự.Diễn viên Scala: Hành vi khác nhau trên JRE 1.5 và 1.6
mô phỏng của tôi với GUI có sẵn trên github: http://github.com/pmeiclx/scala_gear_simulation
Có lẽ bạn nhớ để my first problem with actors. Sau khi giải quyết những vấn đề này, tôi đã làm một GUI cho mô phỏng và tôi có hành vi "lạ" mới này.
Dưới đây là đoạn code mà không GUI:
package ch.clx.actorversions
import actors.Actor
import actors.Actor._
import collection.mutable.ListBuffer
case class ReceivedSpeed(gear: Gear)
case object StartSync
case class SyncGear(controller: GearController, syncSpeed: Int)
object ActorVersion {
def main(args:Array[String]) = {
println("[App] start with creating gears")
val gearList = new ListBuffer[Gear]()
for (i <- 0 until 100) {
gearList += new Gear(i)
}
val gearController = new GearController(gearList)
gearController.start()
gearController ! StartSync
}
}
/**
* CONTROLLER
*/
class GearController(nGears: ListBuffer[Gear]) extends Actor {
private var syncGears = new ListBuffer[Gear]
private var syncSpeed = 0
def act = {
while(true) {
receive {
case StartSync => {
println("[Controller] Send commands for syncing to gears!")
var speeds = new ListBuffer[Int]
nGears.foreach(e => speeds += e.speed)
//Calc avg
//var avgSpeed = speeds.foldLeft(0)(_ + _)/speeds.length
//var avgSpeed = speeds.foldLeft(0) { (x, y) => x + y }/speeds.length
syncSpeed = (0/:speeds)(_ + _)/speeds.length //Average over all gear speeds
//TODO syncSpeed auf Median ausrichten
println("[Controller] calculated syncSpeed: "+syncSpeed)
nGears.foreach{e =>
e.start()
e ! SyncGear(this, syncSpeed)
}
println("[Controller] started all gears")
}
case ReceivedSpeed(gear: Gear) => {
println("[Controller] Syncspeed received by a gear ("+gear.gearId+")")
//println("[Controller] mailboxsize: "+self.mailboxSize)
syncGears += gear
if(syncGears.length == nGears.length) {
println("[Controller] all gears are back in town!")
System.exit(0)
}
}
case _ => println("[Controller] No match :(")
}
}
}
}
/**
* GEAR
*/
class Gear(id: Int) extends Actor {
private var mySpeed = scala.util.Random.nextInt(1000)
private var myController: GearController = null
def speed = mySpeed
def gearId = id
/* Constructor */
println("[Gear ("+id+")] created with speed: "+mySpeed)
def act = {
loop {
react {
case SyncGear(controller: GearController, syncSpeed: Int) => {
//println("[Gear ("+id+")] activated, try to follow controller command (form mySpeed ("+mySpeed+") to syncspeed ("+syncSpeed+")")
myController = controller
adjustSpeedTo(syncSpeed)
}
}
}
}
def adjustSpeedTo(targetSpeed: Int) = {
if(targetSpeed > mySpeed) {
mySpeed += 1
self ! SyncGear(myController, targetSpeed)
}else if(targetSpeed < mySpeed) {
mySpeed -= 1
self ! SyncGear(myController, targetSpeed)
} else if(targetSpeed == mySpeed) {
callController
}
}
def callController = {
println("[Gear ("+id+")] has syncSpeed")
myController ! ReceivedSpeed(this)
}
}
FYI: Tôi đã giải thích vấn đề này với Philipp Haller và anh ấy đã sửa nó trong thân cây. Vì vậy, khi 2.8 được phát hành, nó sẽ không có vấn đề. https://lampsvn.epfl.ch/trac/scala/changeset/20950/scala/trunk/src/actors –
Xin lỗi, tôi hơi bận. Với Snapshot mới nó hoạt động. Không hoàn hảo nhưng nó hoạt động. Cảm ơn bạn! – meip