Skip to content

Commit 7140c2f

Browse files
committed
Added: ExecutorService and CompletableFuture examples
1 parent 292f322 commit 7140c2f

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed
Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,31 @@
11
package com.stacktips.threads;
22

33
import java.io.IOException;
4-
import java.net.URL;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
6+
import java.net.http.HttpClient;
7+
import java.net.http.HttpRequest;
8+
import java.net.http.HttpResponse;
59

610
public class WebScraper {
711

812
String scrapeWebsite(String urlString) {
9-
try {
10-
URL url = new URL(urlString);
11-
try (var stream = url.openStream()) {
12-
int contentLength = stream.readAllBytes().length;
13-
return String.format("URL: %s, Content Length: %d bytes", urlString, contentLength);
14-
}
13+
try (HttpClient client = HttpClient.newHttpClient()) {
14+
HttpRequest request = HttpRequest.newBuilder()
15+
.uri(new URI(urlString))
16+
.build();
17+
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
18+
19+
return String.format("URL: %s, Content Length: %d bytes", urlString, response.body().length());
20+
21+
} catch (URISyntaxException e) {
22+
System.out.println("URI Syntax Exception: " + e.getMessage());
1523
} catch (IOException e) {
16-
return "Error scraping " + urlString + ": " + e.getMessage();
24+
System.out.println("URI Syntax Exception: " + e.getMessage());
25+
} catch (InterruptedException e) {
26+
System.out.println("URI Syntax Exception: " + e.getMessage());
1727
}
28+
29+
return "Error: Unable to scrape website.";
1830
}
1931
}

src/com/stacktips/threads/WebScraperUsingCompletableFuture.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.stacktips.threads;
22

33
import java.util.List;
4-
import java.util.concurrent.*;
4+
import java.util.concurrent.CompletableFuture;
5+
import java.util.concurrent.ExecutorService;
6+
import java.util.concurrent.Executors;
7+
import java.util.concurrent.TimeUnit;
58

69
public class WebScraperUsingCompletableFuture {
710

@@ -15,18 +18,16 @@ public WebScraperUsingCompletableFuture(int nThreads) {
1518

1619
public List<String> scrapeWebsites(List<String> urls) {
1720
List<CompletableFuture<String>> futures = urls.stream()
18-
.map(url -> CompletableFuture.supplyAsync(() -> webScraper.scrapeWebsite(url), executorService)
19-
.orTimeout(30, TimeUnit.SECONDS)
20-
.exceptionally(e -> "Error: " + e.getMessage()))
21-
.toList();
21+
.map(url -> CompletableFuture.supplyAsync(() -> webScraper.scrapeWebsite(url), executorService)
22+
.orTimeout(30, TimeUnit.SECONDS)
23+
.exceptionally(e -> "Error: " + e.getMessage()))
24+
.toList();
2225

2326
return futures.stream()
24-
.map(CompletableFuture::join)
25-
.toList();
27+
.map(CompletableFuture::join)
28+
.toList();
2629
}
2730

28-
29-
3031
public void shutdown() {
3132
executorService.shutdown();
3233
try {
@@ -40,11 +41,11 @@ public void shutdown() {
4041

4142
public static void main(String[] args) {
4243
List<String> urls = List.of(
43-
"https://www.example.com",
44-
"https://www.github.com",
45-
"https://www.stackoverflow.com",
46-
"https://www.java.com",
47-
"https://www.spring.io"
44+
"https://www.example.com",
45+
"https://www.github.com",
46+
"https://www.stackoverflow.com",
47+
"https://www.java.com",
48+
"https://www.spring.io"
4849
);
4950

5051
WebScraperUsingCompletableFuture scraper = new WebScraperUsingCompletableFuture(3);

0 commit comments

Comments
 (0)