Commit 71cd0095 authored by julanar.ali's avatar julanar.ali

Initial commit

parents
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="fifty-shades-of-multithreading-hw2" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>fifty-shades-of-multithreading-hw2</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package PrimerFinder;
import java.util.List;
public class PrimerFinder {
private int start;
private int end;
public List<Integer> getPrimeNumList() {
return primeNumList;
}
private List<Integer> primeNumList;
public PrimerFinder(int start,int end,List<Integer> primes){
this.start=start;
this.end=end;
this.primeNumList=primes;
}
public boolean isPrime(int num){
if(num<2){
return false;
}
else{
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
}
import PrimerFinder.PrimerFinder;
import java.util.ArrayList;
import java.util.List;
public class SequentialCounter {
public static long primesCount(int[] data) {
List<Integer> primes = new ArrayList<>();
long primesCount=0;
PrimerFinder primerFinder = new PrimerFinder(0,data.length, primes);
for (int i = 0; i < data.length; i++) {
if (primerFinder.isPrime(i)) {
synchronized (primerFinder.getPrimeNumList()) {
primerFinder.getPrimeNumList().add(i);
primesCount++;
}
}
}
return primesCount;
}
}
import PrimerFinder.PrimerFinder;
import java.util.ArrayList;
import java.util.List;
public class SequentialSummer {
public static long sum(int[] data) {
long sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return sum;
}
}
package counters;
import worker.WorkPartitioner.Part;
import worker.Worker;
public class Counter extends Worker {
protected long sum;
public Counter(int[] data, Part part) {
super(data, part);
}
public long getSum() {
return sum;
}
}
package counters;
import worker.WorkPartitioner.Part;
import java.util.concurrent.Callable;
public class CounterCallable extends Counter implements Callable<Long> {
public CounterCallable(int[] data,Part part) {
super(data, part);
}
@Override
public Long call() throws Exception {
this.sum = 0;
for (int i = start; i < finish; i++) {
sum += data[i];
}
return sum;
}
}
\ No newline at end of file
package counters;
import summers.Summer;
import worker.WorkPartitioner;
public class CounterRunnable extends Counter implements Runnable{
private Thread thread;
public CounterRunnable(int[] data, WorkPartitioner.Part part) {
super(data, part);
}
@Override
public void run() {
sum = 0;
for (int i = start; i < finish; i++) {
sum += data[i];
}
}
public void startThread() {
thread = new Thread(this);
thread.start();
}
public void joinThread() throws InterruptedException {
thread.join();
}
}
package counters;
import java.util.ArrayList;
import java.util.List;
import PrimerFinder.PrimerFinder;
import worker.WorkPartitioner.Part;
public class CounterThread extends Thread{
private int start;
private int finish;
private int[] data;
private long count;
public CounterThread(int[] data, int start, int finish) {
this.start = start;
this.finish = finish;
this.data = data;
}
public CounterThread(int[] data, Part part) {
this(data, part.getStart(), part.getFinish());
}
@Override
public void run() {
count = 0;
List<Integer> primes=new ArrayList<>();
PrimerFinder primerFinder=new PrimerFinder(start,finish,primes);
for (int i = start; i < finish; i++) {
if (primerFinder.isPrime(i)) {
synchronized (primerFinder.getPrimeNumList()) {
primerFinder.getPrimeNumList().add(i);
count++;
}
}
}
}
public long getCount() {
return count;
}
}
\ No newline at end of file
package data;
public class TestData {
public static int[] createData(int size) {
int[] data = new int[size];
for (int i = 0; i < data.length; i++) {
data[i] = i;
}
return data;
}
}
\ No newline at end of file
import data.TestData;
import parallelCounters.ParallelCounter0;
import parallelSummers.ParallelSummer0;
public class main {
public static void main(String[] args) {
int size = 10;
int[] data = TestData.createData(size);
//long result = SequentialSummer.sum(data);
long result = SequentialCounter.primesCount(data);
int threadCount = 8;
//System.out.println("Sequential summer:" + result);
System.out.println("Sequential Primes Count:" + result);
System.out.println("Parallel Counter 1: " + ParallelCounter0.primesCount(data, 8));
/*System.out.println("Parallel Counter 2: " + ParallelCounter1.sum(data, 8));
System.out.println("Parallel Counter 3: " + ParallelCounter2.sum(data, 8));
System.out.println("Parallel Counter 4: " + ParallelCounter3.sum(data, 8));*/
}
}
package parallelCounters;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import PrimerFinder.PrimerFinder;
import counters.CounterThread;
import summers.SummerThread;
import worker.WorkPartitioner;
import worker.WorkPartitioner.Part;
public class ParallelCounter0{
public static long primesCount(int[] data, int threadCount) {
List<CounterThread> counters = new ArrayList<>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
counters.add(new CounterThread(data,part));
}
for (CounterThread counterThread : counters) {
counterThread.start();
}
for (CounterThread counterThread : counters) {
try {
counterThread.join();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
long count = 0;
for (CounterThread counterThread : counters) {
count += counterThread.getCount();
}
return count;
}
}
package parallelCounters;
import summers.SummerRunnable;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
public class ParallelCounter1 {
public static long sum(int[] data, int threadCount) {
List<SummerRunnable> summers = new ArrayList<>();
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (WorkPartitioner.Part part : parts) {
summers.add(new SummerRunnable(data,part));
}
for (SummerRunnable SummerRunnable : summers) {
SummerRunnable.startThread();
}
for (SummerRunnable SummerRunnable : summers) {
try {
SummerRunnable.joinThread();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
long sum = 0;
for (SummerRunnable summerRunnable : summers) {
sum += summerRunnable.getSum();
}
return sum;
}
}
package parallelCounters;
import summers.SummerThread;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ParallelCounter2{
public static long sum(int[] data, int threadCount) {
List<SummerThread> summers = new ArrayList<>();
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (WorkPartitioner.Part part : parts) {
summers.add(new SummerThread(data,part));
}
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
for (SummerThread summer: summers) {
executor.execute(summer);
}
executor.shutdown();
//Waiting for all the thread to finalize
while (!executor.isTerminated()) {
//System.out.println("Processing....");
}
return summers.stream().mapToLong(SummerThread::getSum).sum();
}
}
package parallelCounters;
import summers.SummerCallable;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import worker.WorkPartitioner.Part;
public class ParallelCounter3 {
public static long sum(int[] data, int threadCount) {
//creating a pool of #threadCount threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<SummerCallable> summers = new ArrayList<SummerCallable>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
summers.add(new SummerCallable(data,part));
}
List<Future<Long>> results;
try {
results = executor.invokeAll(summers);
} catch (InterruptedException e) {
System.err.println("Cannot invoke the threads.");
return -1;
}
executor.shutdown();
long sum = 0;
for (Future<Long> future : results) {
try {
sum += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return sum;
}
}
package parallelCounters;
import summers.SummerCallable;
import worker.WorkPartitioner;
import worker.WorkPartitioner.Part;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ParallelCounter4 {
public static long sum(int[] data, int threadCount) {
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<Long>> results = new ArrayList<Future<Long>>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
results.add(executor.submit(new SummerCallable(data, part)));
}
executor.shutdown();
while (!executor.isTerminated()) {
//System.out.println("Processing...");
}
long sum = 0;
for (Future<Long> future : results) {
try {
sum += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return sum;
}
}
package parallelSummers;
import java.util.ArrayList;
import java.util.List;
import counters.CounterThread;
import summers.SummerThread;
import worker.WorkPartitioner;
import worker.WorkPartitioner.Part;
public class ParallelSummer0 {
public static long primesCount(int[] data, int threadCount) {
List<CounterThread> counters = new ArrayList<>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
counters.add(new CounterThread(data,part));
}
for (CounterThread counterThread : counters) {
counterThread.start();
}
for (CounterThread counterThread : counters) {
try {
counterThread.join();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
int count = 0;
for (CounterThread counterThread : counters) {
count += counterThread.getCount();
}
return count;
}
public static long sum(int[] data, int threadCount) {
List<SummerThread> summers = new ArrayList<>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
summers.add(new SummerThread(data,part));
}
for (SummerThread summerThread : summers) {
summerThread.start();
}
for (SummerThread summerThread : summers) {
try {
summerThread.join();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
int sum = 0;
for (SummerThread summerThread : summers) {
sum += summerThread.getSum();
}
return sum;
}
}
package parallelSummers;
import summers.SummerRunnable;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
public class ParallelSummer1 {
public static long sum(int[] data, int threadCount) {
List<SummerRunnable> summers = new ArrayList<>();
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (WorkPartitioner.Part part : parts) {
summers.add(new SummerRunnable(data,part));
}
for (SummerRunnable SummerRunnable : summers) {
SummerRunnable.startThread();
}
for (SummerRunnable SummerRunnable : summers) {
try {
SummerRunnable.joinThread();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
long sum = 0;
for (SummerRunnable summerRunnable : summers) {
sum += summerRunnable.getSum();
}
return sum;
}
}
package parallelSummers;
import summers.SummerThread;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ParallelSummer2{
public static long sum(int[] data, int threadCount) {
List<SummerThread> summers = new ArrayList<>();
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (WorkPartitioner.Part part : parts) {
summers.add(new SummerThread(data,part));
}
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
for (SummerThread summer: summers) {
executor.execute(summer);
}
executor.shutdown();
//Waiting for all the thread to finalize
while (!executor.isTerminated()) {
//System.out.println("Processing....");
}
return summers.stream().mapToLong(SummerThread::getSum).sum();
}
}
package parallelSummers;
import summers.SummerCallable;
import worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import worker.WorkPartitioner.Part;
public class ParallelSummer3 {
public static long sum(int[] data, int threadCount) {
//creating a pool of #threadCount threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<SummerCallable> summers = new ArrayList<SummerCallable>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
summers.add(new SummerCallable(data,part));
}
List<Future<Long>> results;
try {
results = executor.invokeAll(summers);
} catch (InterruptedException e) {
System.err.println("Cannot invoke the threads.");
return -1;
}
executor.shutdown();
long sum = 0;
for (Future<Long> future : results) {
try {
sum += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return sum;
}
}
package parallelSummers;
import summers.SummerCallable;
import worker.WorkPartitioner;
import worker.WorkPartitioner.Part;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ParallelSummer4 {
public static long sum(int[] data, int threadCount) {
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<Long>> results = new ArrayList<Future<Long>>();
List<Part> parts = WorkPartitioner.partitions(data.length, threadCount);
for (Part part : parts) {
results.add(executor.submit(new SummerCallable(data, part)));
}
executor.shutdown();
while (!executor.isTerminated()) {
//System.out.println("Processing...");
}
long sum = 0;
for (Future<Long> future : results) {
try {
sum += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return sum;
}
}
package summers;
import worker.WorkPartitioner;
import worker.Worker;
public class Summer extends Worker{
protected long sum;
public Summer(int[] data, WorkPartitioner.Part part) {
super(data, part);
}
public long getSum() {
return sum;
}
}
package summers;
import counters.Counter;
import worker.WorkPartitioner;
import java.util.concurrent.Callable;
public class SummerCallable extends Summer implements Callable<Long> {
public SummerCallable(int[] data, WorkPartitioner.Part part) {
super(data, part);
}
@Override
public Long call() throws Exception {
this.sum = 0;
for (int i = start; i < finish; i++) {
sum += data[i];
}
return sum;
}
}
package summers;
import java.util.concurrent.Callable;
import worker.WorkPartitioner.Part;
public class SummerRunnable extends Summer implements Runnable{
private Thread thread;
public SummerRunnable(int[] data, Part part) {
super(data, part);
}
@Override
public void run() {
sum = 0;
for (int i = start; i < finish; i++) {
sum += data[i];
}
}
public void startThread() {
thread = new Thread(this);
thread.start();
}
public void joinThread() throws InterruptedException {
thread.join();
}
}
\ No newline at end of file
package summers;
import java.util.ArrayList;
import java.util.List;
import worker.WorkPartitioner.Part;
public class SummerThread extends Thread{
private int start;
private int finish;
private int[] data;
private long sum;
public SummerThread(int[] data, int start, int finish) {
this.start = start;
this.finish = finish;
this.data = data;
}
public SummerThread(int[] data, Part part) {
this(data, part.getStart(), part.getFinish());
}
@Override
public void run() {
sum = 0;
for (int i = start; i < finish; i++) {
sum += data[i];
}
}
public long getSum() {
return sum;
}
}
\ No newline at end of file
package worker;
import java.util.ArrayList;
import java.util.List;
public class WorkPartitioner {
public static List<Part> partitions(int size, int workerCount){
List<Part> parts = new ArrayList<>();
int part = (int) Math.ceil( (double)size / workerCount);
for (int i = 0; i <workerCount ; i++) {
int start = i * part;
int finish = Math.min((i+1) * part, size);
parts.add(new Part(start, finish));
}
return parts;
}
public static class Part {
private final int start;
private final int finish;
public Part(int start, int finish) {
this.start = start;
this.finish = finish;
}
public int getStart() {
return start;
}
public int getFinish() {
return finish;
}
}
}
package worker;
import worker.WorkPartitioner.Part;
public abstract class Worker {
protected final int start;
protected final int finish;
protected final int[] data;
public Worker(int[] data, int start, int finish) {
this.start = start;
this.finish = finish;
this.data = data;
}
public Worker(int[] data, Part part) {
this(data, part.getStart(), part.getFinish());
}
public int getStart() {
return start;
}
public int getFinish() {
return finish;
}
public int[] getData() {
return data;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment