// <applet code="MandelbrotFractal" width=800 height=600></applet> // MandelbrotFractal.java (FB - 201003276) // N Multi-threaded! import java.applet.Applet; import java.awt.*; import java.awt.image.*; import java.lang.Thread; public class MandelbrotFractal extends Applet { Image img; volatile int pix[]; // will be shared by all threads int w,h,alpha; final int maxThr = 10; // number of threads to run // drawing area (must be xa<xb and ya<yb) final double xa = -2.0; final double xb = 1.0; final double ya = -1.5; final double yb = 1.5; public void init() { w=getSize().width; h=getSize().height; alpha=255; pix=new int[w*h]; manfr(); img=createImage(new MemoryImageSource(w,h,pix,0,w)); } public void manfr() { long startTime = System.currentTimeMillis(); ManFrThread[] m = new ManFrThread[maxThr]; for(int i=0;i<maxThr;i++) { m[i]=new ManFrThread(i); m[i].start(); } // wait until all threads finished boolean stop; do { stop=true; for(int j=0;j<maxThr;j++) { if (m[j].isAlive()) { stop=false; } } }while(!stop); System.out.println("Number of threads: " + maxThr); long timeInMillis = System.currentTimeMillis() - startTime; System.out.println("Run Time in Millis: " + timeInMillis); } public void paint(Graphics g) { g.drawImage(img,0,0,this); } class ManFrThread extends Thread { int k; // id number of this thread ManFrThread(int k) { this.k=k; } public void run() { double x0,x,y,a,b; int red,green,blue; int i,kx,ky,kc; int imax=w*h; // Each thread only calculates its own share of pixels! for(i=k;i<imax;i+=maxThr) { kx=i%w; ky=(i-kx)/w; a=(double)kx/w*(xb-xa)+xa; b=(double)ky/h*(yb-ya)+ya; x=a; y=b; for(kc=0;kc<256;kc++) { x0=x*x-y*y+a; y=2*x*y+b; x=x0; if(x*x+y*y > 4) { // various color palettes can be created here! red=255-(kc%16)*16; green=(16-kc%16)*16; blue=(kc%16)*16; pix[w*ky+kx]=(alpha<<24)|(red<<16)|(green<<8)|blue; break; } } } } } }