├── .gitignore ├── README.md ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src └── main └── java └── com └── learnjava ├── domain ├── Inventory.java ├── Product.java ├── ProductInfo.java ├── ProductOption.java ├── Review.java ├── checkout │ ├── Cart.java │ ├── CartItem.java │ ├── CheckoutResponse.java │ └── CheckoutStatus.java └── github │ └── GitHubPosition.java ├── forkjoin └── StringTransformExample.java ├── service ├── HelloWorldService.java ├── InventoryService.java ├── PriceValidatorService.java ├── ProductInfoService.java ├── ProductService.java └── ReviewService.java ├── thread └── HelloWorldThreadExample.java └── util ├── CommonUtil.java ├── DataSet.java └── LoggerUtil.java /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | 19 | ### NetBeans ### 20 | nbproject/private/ 21 | build/ 22 | nbbuild/ 23 | dist/ 24 | nbdist/ 25 | .nb-gradle/ 26 | .gradle/ 27 | /logs 28 | ### OSX template 29 | .DS_Store 30 | .AppleDouble 31 | .LSOverride 32 | 33 | # IntelliJ 34 | /out/ 35 | 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # parallel-asyncronous 2 | This repo has the code for parallel and asynchronous programming in Java 3 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | } 4 | 5 | group 'com.learnjava' 6 | version '1.0-SNAPSHOT' 7 | 8 | sourceCompatibility = 21 9 | 10 | repositories { 11 | mavenCentral() 12 | } 13 | configurations { 14 | compileOnly { 15 | extendsFrom annotationProcessor 16 | } 17 | } 18 | 19 | test { 20 | useJUnitPlatform() // enables Junit5 21 | } 22 | 23 | dependencies { 24 | 25 | //lombok 26 | compileOnly 'org.projectlombok:lombok:1.18.30' 27 | annotationProcessor 'org.projectlombok:lombok:1.18.30' 28 | 29 | testCompileOnly 'org.projectlombok:lombok:1.18.30' 30 | testAnnotationProcessor 'org.projectlombok:lombok:1.18.30' 31 | 32 | 33 | // StopWatch 34 | implementation('org.apache.commons:commons-lang3:3.0') 35 | 36 | //junit5-dependencies 37 | testImplementation(platform("org.junit:junit-bom:5.9.1")) 38 | testImplementation("org.junit.jupiter:junit-jupiter") 39 | //mockito 40 | testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.2.4' 41 | testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.2.4' 42 | } 43 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dilipsundarraj1/parallel-asynchronous-using-java/74cdc4966342e1bf03719b87ad1392d3c41dc4d2/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS='"-Xmx64m"' 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS="-Xmx64m" 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'parallel-asyncronous' 2 | 3 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/Inventory.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | @Data 11 | @Builder 12 | public class Inventory { 13 | private int count; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/Product.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain; 2 | 3 | import lombok.*; 4 | 5 | @Data 6 | @NoArgsConstructor 7 | @AllArgsConstructor 8 | @Builder 9 | public class Product { 10 | 11 | @NonNull 12 | private String productId; 13 | @NonNull 14 | private ProductInfo productInfo; 15 | @NonNull 16 | private Review review; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/ProductInfo.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | @Builder 14 | public class ProductInfo { 15 | private String productId; 16 | private List productOptions; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/ProductOption.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Builder 12 | public class ProductOption { 13 | private Integer productionOptionId; 14 | private String size; 15 | private String color; 16 | private double price; 17 | private Inventory inventory; 18 | 19 | public ProductOption(Integer productionOptionId, String size, String color, double price) { 20 | this.productionOptionId = productionOptionId; 21 | this.size = size; 22 | this.color = color; 23 | this.price = price; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/Review.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | @Data 11 | @Builder 12 | public class Review { 13 | private int noOfReviews; 14 | private double overallRating; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/checkout/Cart.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain.checkout; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | @Builder 14 | public class Cart { 15 | 16 | private Integer cardId; 17 | private List cartItemList; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/checkout/CartItem.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain.checkout; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class CartItem { 11 | 12 | private Integer itemId; 13 | private String itemName; 14 | private double rate; 15 | private Integer quantity; 16 | private boolean isExpired; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/checkout/CheckoutResponse.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain.checkout; 2 | 3 | 4 | import lombok.Data; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | @Data 10 | public class CheckoutResponse { 11 | 12 | CheckoutStatus checkoutStatus; 13 | List errorList = new ArrayList<>(); 14 | double finalRate; 15 | 16 | public CheckoutResponse(CheckoutStatus checkoutStatus) { 17 | this.checkoutStatus = checkoutStatus; 18 | } 19 | 20 | public CheckoutResponse(CheckoutStatus checkoutStatus, List errorList) { 21 | this.checkoutStatus = checkoutStatus; 22 | this.errorList = errorList; 23 | } 24 | 25 | public CheckoutResponse(CheckoutStatus checkoutStatus, double finalRate) { 26 | this.checkoutStatus = checkoutStatus; 27 | this.finalRate = finalRate; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/checkout/CheckoutStatus.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain.checkout; 2 | 3 | public enum CheckoutStatus { 4 | SUCCESS, 5 | FAILURE 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/domain/github/GitHubPosition.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.domain.github; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | @Builder 13 | public class GitHubPosition { 14 | private String id; 15 | private String type; 16 | private String url; 17 | private String created_at; 18 | private String company; 19 | private String company_url; 20 | private String location; 21 | private String title; 22 | private String description; 23 | private String how_to_apply; 24 | private String company_logo; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/forkjoin/StringTransformExample.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.forkjoin; 2 | 3 | import com.learnjava.util.DataSet; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | import static com.learnjava.util.CommonUtil.delay; 9 | import static com.learnjava.util.CommonUtil.stopWatch; 10 | import static com.learnjava.util.LoggerUtil.log; 11 | 12 | public class StringTransformExample { 13 | 14 | public static void main(String[] args) { 15 | 16 | stopWatch.start(); 17 | List resultList = new ArrayList<>(); 18 | List names = DataSet.namesList(); 19 | log("names : "+ names); 20 | 21 | names.forEach((name)->{ 22 | String newValue = addNameLengthTransform(name); 23 | resultList.add(newValue); 24 | }); 25 | stopWatch.stop(); 26 | log("Final Result : "+ resultList); 27 | log("Total Time Taken : "+ stopWatch.getTime()); 28 | } 29 | 30 | 31 | private static String addNameLengthTransform(String name) { 32 | delay(500); 33 | return name.length()+" - "+name ; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/HelloWorldService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | import java.util.concurrent.CompletableFuture; 4 | 5 | import static com.learnjava.util.CommonUtil.delay; 6 | import static com.learnjava.util.LoggerUtil.log; 7 | 8 | public class HelloWorldService { 9 | 10 | public String helloWorld() { 11 | delay(1000); 12 | log("inside helloWorld"); 13 | return "hello world"; 14 | } 15 | 16 | public String hello() { 17 | delay(1000); 18 | log("inside hello"); 19 | return "hello"; 20 | } 21 | 22 | public String world() { 23 | delay(1000); 24 | log("inside world"); 25 | return " world!"; 26 | } 27 | 28 | public CompletableFuture worldFuture(String input) { 29 | return CompletableFuture.supplyAsync(()->{ 30 | delay(1000); 31 | return input+" world!"; 32 | }); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/InventoryService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | import com.learnjava.domain.Inventory; 4 | import com.learnjava.domain.ProductOption; 5 | 6 | import java.util.concurrent.CompletableFuture; 7 | 8 | import static com.learnjava.util.CommonUtil.delay; 9 | 10 | public class InventoryService { 11 | public Inventory addInventory(ProductOption productOption) { 12 | delay(500); 13 | return Inventory.builder() 14 | .count(2).build(); 15 | 16 | } 17 | 18 | public CompletableFuture addInventory_CF(ProductOption productOption) { 19 | 20 | return CompletableFuture.supplyAsync(() -> { 21 | delay(500); 22 | return Inventory.builder() 23 | .count(2).build(); 24 | }); 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/PriceValidatorService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | 4 | import com.learnjava.domain.checkout.CartItem; 5 | 6 | import static com.learnjava.util.CommonUtil.delay; 7 | 8 | public class PriceValidatorService { 9 | 10 | public boolean isCartItemInvalid(CartItem cartItem){ 11 | int cartId = cartItem.getItemId(); 12 | delay(500); 13 | if (cartId == 7 || cartId == 9 || cartId == 11) { 14 | return true; 15 | } 16 | return false; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/ProductInfoService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | import com.learnjava.domain.ProductInfo; 4 | import com.learnjava.domain.ProductOption; 5 | 6 | import java.util.List; 7 | 8 | import static com.learnjava.util.CommonUtil.delay; 9 | 10 | public class ProductInfoService { 11 | 12 | public ProductInfo retrieveProductInfo(String productId) { 13 | delay(1000); 14 | List productOptions = List.of(new ProductOption(1, "64GB", "Black", 699.99), 15 | new ProductOption(2, "128GB", "Black", 749.99)); 16 | return ProductInfo.builder().productId(productId) 17 | .productOptions(productOptions) 18 | .build(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/ProductService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | import com.learnjava.domain.Product; 4 | import com.learnjava.domain.ProductInfo; 5 | import com.learnjava.domain.Review; 6 | import static com.learnjava.util.CommonUtil.stopWatch; 7 | import static com.learnjava.util.LoggerUtil.log; 8 | 9 | public class ProductService { 10 | private ProductInfoService productInfoService; 11 | private ReviewService reviewService; 12 | 13 | public ProductService(ProductInfoService productInfoService, ReviewService reviewService) { 14 | this.productInfoService = productInfoService; 15 | this.reviewService = reviewService; 16 | } 17 | 18 | public Product retrieveProductDetails(String productId) { 19 | stopWatch.start(); 20 | 21 | ProductInfo productInfo = productInfoService.retrieveProductInfo(productId); // blocking call 22 | Review review = reviewService.retrieveReviews(productId); // blocking call 23 | 24 | stopWatch.stop(); 25 | log("Total Time Taken : "+ stopWatch.getTime()); 26 | return new Product(productId, productInfo, review); 27 | } 28 | 29 | public static void main(String[] args) { 30 | 31 | ProductInfoService productInfoService = new ProductInfoService(); 32 | ReviewService reviewService = new ReviewService(); 33 | ProductService productService = new ProductService(productInfoService, reviewService); 34 | String productId = "ABC123"; 35 | Product product = productService.retrieveProductDetails(productId); 36 | log("Product is " + product); 37 | 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/service/ReviewService.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.service; 2 | 3 | import com.learnjava.domain.Review; 4 | 5 | import static com.learnjava.util.CommonUtil.delay; 6 | 7 | public class ReviewService { 8 | 9 | public Review retrieveReviews(String productId) { 10 | delay(1000); 11 | return new Review(200, 4.5); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/thread/HelloWorldThreadExample.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.thread; 2 | 3 | import static com.learnjava.util.CommonUtil.delay; 4 | 5 | public class HelloWorldThreadExample { 6 | private static String result=""; 7 | 8 | private static void hello(){ 9 | delay(700); 10 | result = result.concat("Hello"); 11 | } 12 | private static void world(){ 13 | delay(600); 14 | result = result.concat("World"); 15 | } 16 | 17 | public static void main(String[] args) throws InterruptedException { 18 | 19 | Thread helloThread = new Thread(()-> hello()); 20 | Thread worldThread = new Thread(()-> world()); 21 | 22 | //Starting the thread 23 | helloThread.start(); 24 | worldThread.start(); 25 | 26 | //Joining the thread (Waiting for the threads to finish) 27 | helloThread.join(); 28 | worldThread.join(); 29 | 30 | System.out.println("Result is : " + result); 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/util/CommonUtil.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.util; 2 | 3 | import org.apache.commons.lang3.time.StopWatch; 4 | 5 | import static com.learnjava.util.LoggerUtil.log; 6 | import static java.lang.Thread.sleep; 7 | 8 | public class CommonUtil { 9 | 10 | public static StopWatch stopWatch = new StopWatch(); 11 | 12 | public static void delay(long delayMilliSeconds) { 13 | try{ 14 | sleep(delayMilliSeconds); 15 | }catch (Exception e){ 16 | LoggerUtil.log("Exception is :" + e.getMessage()); 17 | } 18 | 19 | } 20 | 21 | public static String transForm(String s) { 22 | CommonUtil.delay(500); 23 | return s.toUpperCase(); 24 | } 25 | 26 | public static void startTimer(){ 27 | stopWatch.start(); 28 | } 29 | 30 | public static void timeTaken(){ 31 | stopWatch.stop(); 32 | log("Total Time Taken : " +stopWatch.getTime()); 33 | } 34 | 35 | public static void stopWatchReset(){ 36 | stopWatch.reset(); 37 | } 38 | 39 | public static int noOfCores(){ 40 | return Runtime.getRuntime().availableProcessors(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/util/DataSet.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.util; 2 | 3 | 4 | import com.learnjava.domain.checkout.Cart; 5 | import com.learnjava.domain.checkout.CartItem; 6 | 7 | import java.util.ArrayList; 8 | import java.util.LinkedList; 9 | import java.util.List; 10 | import java.util.Set; 11 | import java.util.stream.Collectors; 12 | import java.util.stream.IntStream; 13 | 14 | public class DataSet { 15 | 16 | public static List lowerCaseAlphabetList = List.of("a", "b", "c", "a", "d", "e", "f", "e", "g", "h", "i"); 17 | 18 | public static Cart createCart(int noOfItemsInCart) { 19 | 20 | Cart cart = new Cart(); 21 | List cartItemList = new ArrayList<>(); 22 | IntStream.rangeClosed(1, noOfItemsInCart) 23 | .forEach((index) -> { 24 | String cartItem = "CartItem -".concat(index + ""); 25 | CartItem cartItem1 = new CartItem(index, cartItem, generateRandomPrice(), index, false); 26 | cartItemList.add(cartItem1); 27 | }); 28 | cart.setCartItemList(cartItemList); 29 | return cart; 30 | } 31 | 32 | public static List namesList() { 33 | return List.of("Bob", "Jamie", "Jill", "Rick"); 34 | 35 | } 36 | 37 | public static List generateIntegerList(int maxNumber) { 38 | return IntStream.rangeClosed(1, maxNumber) 39 | .boxed().collect(Collectors.toList()); 40 | } 41 | 42 | public static ArrayList generateArrayList(int maxNumber) { 43 | ArrayList arrayList = new ArrayList<>(); 44 | 45 | IntStream.rangeClosed(1, maxNumber) 46 | .boxed() 47 | .forEach((arrayList::add)); 48 | return arrayList; 49 | } 50 | 51 | public static LinkedList generateIntegerLinkedList(int maxNumber) { 52 | LinkedList linkedList = new LinkedList<>(); 53 | IntStream.rangeClosed(1, maxNumber) 54 | .boxed() 55 | .forEach((linkedList::add)); 56 | return linkedList; 57 | } 58 | 59 | public static Set generateIntegerSet(int maxNumber) { 60 | return IntStream.rangeClosed(1, maxNumber) 61 | .boxed().collect(Collectors.toSet()); 62 | } 63 | 64 | 65 | 66 | public static double generateRandomPrice() { 67 | int min = 50; 68 | int max = 100; 69 | return Math.random() * (max - min + 1) + min; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/learnjava/util/LoggerUtil.java: -------------------------------------------------------------------------------- 1 | package com.learnjava.util; 2 | 3 | public class LoggerUtil { 4 | 5 | public static void log(String message){ 6 | 7 | System.out.println("[" + Thread.currentThread().getName() +"] - " + message); 8 | 9 | } 10 | } 11 | --------------------------------------------------------------------------------