import scala.actors._
import scala.actors.Actor._
import scala.util.Random
import java.util.Date
object Actors{
def main(args: Array[String]){
val actors = new Array[Actor](250000)
for(i <- 0 to 249999){
actors(i) = actor{
loop{
react{
case fibNum: Int => calculate(fibNum, i)
}
}
}
}
val random = new Random()
for(a <- actors){
a ! random.nextInt(25)
}
}
def calculate(fibNum: Int, i: Int) = {
val answer = fibonacci(fibNum)
if((i + 1) % 1000 == 0){
val idPlusOne = i + 1
println("The " + fibNum + "th fibonacci number is " + answer + " (thread: " + idPlusOne + ")")
}
if((i + 1) % 250000 == 0){
System.exit(0)
}
}
def fibonacci( n: Int): Int = n match {
case 0 => 0
case 1 => 1
case _ => fibonacci(n -1) + fibonacci(n - 2)
}
}
同等功能的java实现
import java.util.Date;
import java.util.Random;
public class JavaThreads extends Thread{
private static int THREAD_COUNT = 250000;
private int fibNum;
private int jid;
public JavaThreads(int id, int fibNum){
this.jid = id;
this.fibNum = fibNum;
}
public void run(){
int answer = fibonacci(fibNum);
if(this.jid % 1000 == 0){
System.out.println("The " + fibNum + "th fibonacci number is " + answer + " (thread: " + this.jid + ")");
}
}
private int fibonacci(int i){
if(i < 2){ return i;}
return fibonacci(i - 1) + fibonacci(i - 2);
}
public int getJid(){
return jid;
}
public void setJid(int jid){
this.jid = jid;
}
public int getFibNum(){
return fibNum;
}
public void setFibNum(int fibNum){
this.fibNum = fibNum;
}
public static void main(String args[]){
Date beginDate = new Date();
long memoryBegin = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
JavaThreads threads[] = new JavaThreads[THREAD_COUNT];
Random random = new Random();
for(int i = 0; i < THREAD_COUNT; i++){
threads[i] = new JavaThreads(i, random.nextInt(25));
}
for(JavaThreads thread : threads){
thread.start();
}
long memoryEnd = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
Date endDate = new Date();
System.out.println("Completed in " + ((endDate.getTime() - beginDate.getTime())/1000) + " seconds");
System.out.println("Used memory: " + (memoryEnd - memoryBegin));
}
}