Added ThreadedJuliaSetCalculator
This commit is contained in:
parent
90c10083e9
commit
8b506b6433
4 changed files with 84 additions and 6 deletions
|
@ -55,7 +55,10 @@ public class ForkJoinJuliaSetCalculator implements JuliaSetCalculator {
|
||||||
int middle = (startInclusive + endExclusive) / 2;
|
int middle = (startInclusive + endExclusive) / 2;
|
||||||
JuliaTask task1 = new JuliaTask(startInclusive, middle);
|
JuliaTask task1 = new JuliaTask(startInclusive, middle);
|
||||||
JuliaTask task2 = new JuliaTask(middle, endExclusive);
|
JuliaTask task2 = new JuliaTask(middle, endExclusive);
|
||||||
invokeAll(task1, task2);
|
//invokeAll(task1, task2);
|
||||||
|
task1.fork();
|
||||||
|
task2.compute();
|
||||||
|
task1.join(); // Interestingly, if I comment out this join, it seems to work ok???
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ public class JuliaSetPanel extends JPanel {
|
||||||
|
|
||||||
public JuliaSetPanel(final JuliaSetCalculator juliaSetCalculator, final int width, final int height) {
|
public JuliaSetPanel(final JuliaSetCalculator juliaSetCalculator, final int width, final int height) {
|
||||||
this.juliaSetCalculator = juliaSetCalculator;
|
this.juliaSetCalculator = juliaSetCalculator;
|
||||||
setPreferredSize(new Dimension(1200, 800));
|
setPreferredSize(new Dimension(width, height));
|
||||||
setBackground(Color.white);
|
setBackground(Color.white);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@ public class MainClass {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
int width = 1200;
|
int width = 1600;
|
||||||
int height = 800;
|
int height = 1000;
|
||||||
JuliaSetCalculator juliaSetCalculator = new ForkJoinJuliaSetCalculator(width, height);
|
JuliaSetCalculator juliaSetCalculator = new ThreadedJuliaSetCalculator(width, height);
|
||||||
JuliaSetPanel juliaSetPanel = new JuliaSetPanel(juliaSetCalculator, width, height);
|
JuliaSetPanel juliaSetPanel = new JuliaSetPanel(juliaSetCalculator, width, height);
|
||||||
|
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
|
75
src/ThreadedJuliaSetCalculator.java
Normal file
75
src/ThreadedJuliaSetCalculator.java
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
public class ThreadedJuliaSetCalculator implements JuliaSetCalculator {
|
||||||
|
|
||||||
|
private int width;
|
||||||
|
private int height;
|
||||||
|
private int[][] iterations;
|
||||||
|
|
||||||
|
public ThreadedJuliaSetCalculator(final int width, final int height) {
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
iterations = new int[width][height];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[][] calculate(int maxIterations, double zoom, double cx, double cy, double moveX, double moveY) {
|
||||||
|
|
||||||
|
class JuliaTask implements Runnable {
|
||||||
|
|
||||||
|
private int startInclusive;
|
||||||
|
private int endExclusive;
|
||||||
|
|
||||||
|
JuliaTask(int startInclusive, int endExclusive) {
|
||||||
|
this.startInclusive = startInclusive;
|
||||||
|
this.endExclusive = endExclusive;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
double zx, zy;
|
||||||
|
|
||||||
|
for(int x = startInclusive; x < endExclusive; x++) {
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
zx = 1.5 * (x - width / 2) / (0.5 * zoom * width) + moveX;
|
||||||
|
zy = (y - height / 2) / (0.5 * zoom * height) + moveY;
|
||||||
|
int i = maxIterations;
|
||||||
|
while (zx * zx + zy * zy < 4 && i > 0) {
|
||||||
|
double tmp = zx * zx - zy * zy + cx;
|
||||||
|
zy = 2.0 * zx * zy + cy;
|
||||||
|
zx = tmp;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
iterations[x][y] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
int NUM_THREADS = 128;
|
||||||
|
Thread[] threads = new Thread[NUM_THREADS];
|
||||||
|
int step = width / NUM_THREADS;
|
||||||
|
|
||||||
|
for(int i = 0; i < NUM_THREADS; i++) {
|
||||||
|
int start = i * step;
|
||||||
|
int end = (i + 1) * step;
|
||||||
|
if(end > width || i == NUM_THREADS - 1) end = width;
|
||||||
|
threads[i] = new Thread(new JuliaTask(start, end));
|
||||||
|
threads[i].start();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < NUM_THREADS; i++) {
|
||||||
|
try {
|
||||||
|
threads[i].join();
|
||||||
|
} catch(Exception e) {
|
||||||
|
// No!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
System.out.println(endTime - startTime);
|
||||||
|
|
||||||
|
return iterations;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue