I must be doing something wrong regarding my groovy code. I was talking to a friend and fiddling with a tower of hanoi solver code. Just burns in CPU basically. Now I hacked it up in groovy, after he talked about it, just because. Well I came up with a groovy-ish solution that should do the same thing his java code did. However, the Java code actually ran like 8 threads, whereas my groovy code only ran about 3. Based entirely on CPU usage in linux. On the same box. I don’t understand… The code follows.
importjava.util.concurrent.atomic.AtomicIntegerimportjava.util.concurrent.Executorsimportjava.util.concurrent.CallabledefmoveSingleDisk(source,dest){//nothing!}defmoveTower(number,source,dest,temp){if(number>0){moveTower(number-1,source,temp,dest)moveSingleDisk(source,dest)moveTower(number-1,temp,dest,source)}}AtomicIntegercounter=newAtomicInteger()counter.set(1)synchronizedout(message){printlnmessage}deflogic={start=System.nanoTime()moveTower(it,'A','B','C')stop=System.nanoTime()out("${it} took ${(stop-start)/ 10**6} milliseconds")}defTHREADS=16pool=Executors.newFixedThreadPool(THREADS)println"Creating a pool for $THREADS threads"1.upto(64){defvalue=it//out "Submitting job $value"task={c->pool.submit(casCallable)}task{logic(value)}}pool.shutdown()
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagehanoi2;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/** * * @author brad */publicclassMain{staticprivateExecutorServiceexec=Executors.newFixedThreadPool(8);staticvoidmoveSingleDisk(charsrc,chardst){// System.out.println(src + " => " + dst);}staticvoidmoveTower(intn,charsrc,chardst,chartmp){if(n>0){moveTower(n-1,src,tmp,dst);moveSingleDisk(src,dst);moveTower(n-1,tmp,dst,src);}}publicvoidrun(){}publicstaticvoidmain(String[]args){System.out.println("Starting with a thread pool of 8");for(inti=0;i<=64;i++){// long start, stop;finalintblah=i;exec.submit(newRunnable(){publicvoidrun(){longstart=System.nanoTime();moveTower(blah,'A','B','C');longstop=System.nanoTime();System.out.println(blah+" took "+((stop-start)/1000000)+"ms");}});}}}