Commit 45f4c5ab authored by sahar.moalla's avatar sahar.moalla

executor_service_framework

parent 3b8fc861
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
\ No newline at end of file
# Default ignored files
/shelf/
/workspace.xml
<?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="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_1_8" default="true" project-jdk-name="17" 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 version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</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>lab2</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
\ No newline at end of file
package org.PrimeProj.Counters;
import org.PrimeProj.Worker.WorkPartitioner;
import java.util.concurrent.Callable;
import static org.PrimeProj.Counters.CounterThread.isPrime;
public class CounterCallable extends PrimesCounter implements Callable<Long> {
public CounterCallable(WorkPartitioner.Part part) {
super(part);
}
@Override
public Long call() throws Exception {
long count = 0;
for(int i = start; i<=finish; i++){
if(isPrime(i)){
count++;
}
}
return count;
}
}
package org.PrimeProj.Counters;
import org.PrimeProj.Worker.WorkPartitioner;
import org.w3c.dom.css.Counter;
import static org.PrimeProj.Counters.CounterThread.isPrime;
public class CounterRunnable extends PrimesCounter implements Runnable{
private Thread thread;
public CounterRunnable(WorkPartitioner.Part part) {
super(part);
}
@Override
public void run() {
count = 0;
for(int i = start; i<=finish; i++){
if(isPrime(i)){
count++;
}
}
}
public void startThread() {
thread = new Thread(this);
thread.start();
}
public void joinThread() throws InterruptedException {
thread.join();
}
}
package org.PrimeProj.Counters;
import org.PrimeProj.Worker.WorkPartitioner;
public class CounterThread extends Thread{
private int start;
private int finish;
private long count;
public CounterThread( int start, int finish) {
this.start = start;
this.finish = finish;
}
public CounterThread(WorkPartitioner.Part part) {
this(part.getStart(), part.getFinish());
}
public static boolean isPrime(int number) {
if (number <= 1) return false;
else if (number == 2) {
return true;
} else {
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) return false;
}
return true;
}
}
@Override
public void run() {
count = 0; // Update the class variable
for(int i = start; i <= finish; i++) {
if(isPrime(i)) {
count++;
}
}
}
public long getCount() {
return count;
}
}
package org.PrimeProj.Counters;
import org.PrimeProj.Worker.WorkPartitioner;
import org.PrimeProj.Worker.Worker;
public class PrimesCounter extends Worker {
protected long count;
public PrimesCounter(int start, int finish) {
super(start, finish);
}
public PrimesCounter(WorkPartitioner.Part part) {
super(part);
}
public long getCount() {
return count;
}
}
package org.PrimeProj;
import org.PrimeProj.ParallelCounters.*;
public class Main {
public static void main(String[] args) {
int start = 0;
int finish = 1000000;
int threadCount = 4;
int sequentialResult = SequentialCounter.countPrimes(start,finish);
System.out.println("Sequential counter:" + sequentialResult);
System.out.println("Parallel counter 0: " + ParallelCounter0.countPrimes(start,finish,threadCount));
System.out.println("Parallel counter 1: " + ParallelCounter1.countPrimes(start,finish,threadCount));
System.out.println("Parallel counter 2: " + ParallelCounter2.countPrimes(start,finish,threadCount));
System.out.println("Parallel counter 3: " + ParallelCounter3.countPrimes(start,finish,threadCount));
System.out.println("Parallel counter 4: " + ParallelCounter4.countPrimes(start,finish,threadCount));
}
}
\ No newline at end of file
package org.PrimeProj.ParallelCounters;
//This class calculates the number of prime numbers using CounterThread and conventional thread
//start and join mechanisms.
import org.PrimeProj.Counters.CounterThread;
import org.PrimeProj.Worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
public class ParallelCounter0 {
public static long countPrimes(int rangeStart, int rangeFinish, int threadCount) {
List<CounterThread> counters = new ArrayList<>();
int range = rangeFinish - rangeStart + 1;
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(range, threadCount);
for (WorkPartitioner.Part part : parts) {
counters.add(new CounterThread(part));
}
for (CounterThread summerThread : counters) {
summerThread.start();
}
for (CounterThread summerThread : counters) {
try {
summerThread.join();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
long count = 0;
for (CounterThread counterThread : counters) {
count += counterThread.getCount();
}
return count;
}
}
package org.PrimeProj.ParallelCounters;
//This class calculates the number of prime numbers using CounterRunnable and conventional thread
//start and join mechanisms.
import org.PrimeProj.Counters.CounterRunnable;
import org.PrimeProj.Worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
public class ParallelCounter1 {
public static long countPrimes(int rangeStart, int rangeFinish, int threadCount) {
List<CounterRunnable> counters = new ArrayList<>();
int range = rangeFinish - rangeStart + 1;
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(range, threadCount);
for (WorkPartitioner.Part part : parts) {
counters.add(new CounterRunnable(part));
}
for (CounterRunnable counterRunnable : counters) {
counterRunnable.startThread();
}
for (CounterRunnable counterRunnable : counters) {
try {
counterRunnable.joinThread();
} catch (InterruptedException e) {
System.err.println("Thread cannot join!");
}
}
long count = 0;
for (CounterRunnable counterRunnable : counters) {
count += counterRunnable.getCount();
}
return count;
}
}
package org.PrimeProj.ParallelCounters;
import org.PrimeProj.Counters.CounterThread;
import org.PrimeProj.Worker.WorkPartitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//This class calculates the number of prime numbers using CounterThread and ExecutorService
//with a fixed thread pool. The class executes the threads one bye one.
public class ParallelCounter2 {
public static long countPrimes(int rangeStart, int rangeFinish, int threadCount) {
List<CounterThread> counters = new ArrayList<>();
int range = rangeFinish - rangeStart + 1;
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(range, threadCount);
for (WorkPartitioner.Part part : parts) {
counters.add(new CounterThread(part));
}
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
for (CounterThread counter: counters) {
executor.execute(counter);
}
executor.shutdown();
//Waiting for all the thread to finalize
while (!executor.isTerminated()) {
//System.out.println("Processing....");
}
return counters.stream().mapToLong(CounterThread::getCount).sum();
}
}
package org.PrimeProj.ParallelCounters;
import org.PrimeProj.Counters.CounterCallable;
import org.PrimeProj.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;
// This class calculates the number of prime numbers using CounterCallable and ExecutorService
// with a fixed thread pool. The class invokes all the callables at once.
public class ParallelCounter3 {
public static long countPrimes(int rangeStart, int rangeFinish, int threadCount) {
//creating a pool of #threadCount threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<CounterCallable> counters = new ArrayList<CounterCallable>();
int range = rangeFinish - rangeStart + 1;
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(range, threadCount);
for (WorkPartitioner.Part part : parts) {
counters.add(new CounterCallable(part));
}
List<Future<Long>> results;
try {
results = executor.invokeAll(counters);
} catch (InterruptedException e) {
System.err.println("Cannot invoke the threads.");
return -1;
}
executor.shutdown();
long count = 0;
for (Future<Long> future : results) {
try {
count += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return count;
}
}
package org.PrimeProj.ParallelCounters;
import org.PrimeProj.Counters.CounterCallable;
import org.PrimeProj.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;
// This class calculates the number of prime numbers using CounterThread and ExecutorService
// with a fixed thread pool. The class submits the threads one bye one for executions.
public class ParallelCounter4 {
public static long countPrimes(int rangeStart, int rangeFinish, int threadCount) {
//creating a pool of 5 threads
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<Long>> results = new ArrayList<Future<Long>>();
int range = rangeFinish - rangeStart + 1;
List<WorkPartitioner.Part> parts = WorkPartitioner.partitions(range, threadCount);
for (WorkPartitioner.Part part : parts) {
results.add(executor.submit(new CounterCallable(part)));
}
executor.shutdown();
while (!executor.isTerminated()) {
//System.out.println("Processing...");
}
long count = 0;
for (Future<Long> future : results) {
try {
count += future.get();
} catch (InterruptedException | ExecutionException e) {
System.err.println("Cannot get the results from threads.");
return -2;
}
}
return count;
}
}
package org.PrimeProj;
import static org.PrimeProj.Counters.CounterThread.isPrime;
public class SequentialCounter {
public static int countPrimes(int rangeStart, int rangeFinish) {
int counter = 0;
for(int i = rangeStart; i<=rangeFinish; i++){
if(isPrime(i)){
counter++;
}
}
return counter;
}
}
package org.PrimeProj.Worker;
import java.util.ArrayList;
import java.util.List;
public class WorkPartitioner {
public static List<Part> partitions(int range, int workerCount){
List<Part> parts = new ArrayList<>();
int part = (int) Math.ceil( (double)range / workerCount);
for (int i = 0; i <workerCount ; i++) {
int start = i * part;
int finish = Math.min((i+1) * part, range);
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 org.PrimeProj.Worker;
public class Worker {
protected final int start;
protected final int finish;
public Worker(int start, int finish) {
this.start = start;
this.finish = finish;
}
public Worker(WorkPartitioner.Part part) {
this(part.getStart(), part.getFinish());
}
public int getStart() {
return start;
}
public int getFinish() {
return finish;
}
}
import static org.junit.jupiter.api.Assertions.*;
import org.PrimeProj.ParallelCounters.*;
import org.PrimeProj.SequentialCounter;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class ParallelCountersTest {
private static int rangeStart;
private static int rangeEnd;
private static long result;
@BeforeAll
public static void initialize() {
rangeStart = 0;
rangeEnd = 100000;
result = SequentialCounter.countPrimes(rangeStart,rangeEnd);
}
private static void testAll(int threadCount) {
assertEquals(result, ParallelCounter0.countPrimes(rangeStart,rangeEnd,threadCount));
assertEquals(result, ParallelCounter1.countPrimes(rangeStart,rangeEnd,threadCount));
assertEquals(result, ParallelCounter2.countPrimes(rangeStart,rangeEnd,threadCount));
assertEquals(result, ParallelCounter3.countPrimes(rangeStart,rangeEnd,threadCount));
assertEquals(result, ParallelCounter4.countPrimes(rangeStart,rangeEnd,threadCount));
}
@Test
void testSingleThread() {
testAll(1);
}
@Test
void testTwoThread() {
testAll(2);
}
@Test
void testFourThread() {
testAll(4);
}
@Test
void testEightThread() {
testAll(8);
}
@Test
void testSixteenThread() {
testAll(16);
}
}
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