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