Skip to content

Commit 787fbee

Browse files
committed
task2606
1 parent da84448 commit 787fbee

File tree

1 file changed

+113
-0
lines changed
  • 3.JavaMultithreading/src/com/javarush/task/task26/task2606

1 file changed

+113
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.javarush.task.task26.task2606;
2+
3+
import java.net.MalformedURLException;
4+
import java.net.URL;
5+
import java.util.*;
6+
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executors;
8+
import java.util.concurrent.TimeUnit;
9+
10+
/*
11+
Тот, кто любит труд, не нуждается в развлечениях
12+
*/
13+
14+
public class Solution {
15+
private final URL javarushUrl;
16+
private final URL javarushUrl1Child;
17+
private final URL javarushVkGroupUrl;
18+
private final URL javarushVkGroupUrl1Child;
19+
private final URL javarushVkGroupUrl2Child;
20+
private final URL javarushVkGroupUrl3Child;
21+
22+
private volatile ExecutorService executorService;
23+
private final Set<URL> urlsForProcessing = Collections.synchronizedSet(new HashSet<>());
24+
25+
public static void main(String[] args) throws MalformedURLException, InterruptedException {
26+
Solution solution = new Solution();
27+
solution.start();
28+
Thread.sleep(1000);
29+
solution.stop();
30+
}
31+
32+
public Solution() throws MalformedURLException {
33+
javarushUrl = new URL("http://javarush.ru/");
34+
javarushVkGroupUrl = new URL("http://vk.com/javarush");
35+
javarushUrl1Child = new URL("http://info.javarush.ru/page/FAQ/");
36+
javarushVkGroupUrl1Child = new URL("https://plus.google.com/114772402300089087607/about");
37+
javarushVkGroupUrl2Child = new URL("https://www.facebook.com/pages/Javarush/524321077686033");
38+
javarushVkGroupUrl3Child = new URL("https://twitter.com/javarush_ru");
39+
40+
urlsForProcessing.add(javarushUrl);
41+
urlsForProcessing.add(javarushVkGroupUrl);
42+
}
43+
44+
public synchronized void start() {
45+
executorService = Executors.newCachedThreadPool();
46+
for (URL url : urlsForProcessing) {
47+
submitUrlTask(url);
48+
}
49+
urlsForProcessing.clear();
50+
}
51+
52+
public synchronized void stop() throws InterruptedException {
53+
try {
54+
saveUnprocessedUrls(executorService.shutdownNow());
55+
if (executorService.awaitTermination(1_000, TimeUnit.MILLISECONDS)) {
56+
saveUnprocessedUrls(getCancelledTasksFromExecutor());
57+
}
58+
} finally {
59+
executorService = null;
60+
}
61+
}
62+
63+
private List<Runnable> getCancelledTasksFromExecutor() {
64+
return Collections.EMPTY_LIST;
65+
}
66+
67+
protected List<URL> processPage(URL url) {
68+
System.out.println(url + " will be processed");
69+
return getChildUrlByParent(url);
70+
}
71+
72+
private List<URL> getChildUrlByParent(URL url) {
73+
List<URL> result = new ArrayList<>();
74+
75+
if (javarushUrl.equals(url)) {
76+
result.add(javarushUrl1Child);
77+
} else if (javarushVkGroupUrl.equals(url)) {
78+
result.add(javarushVkGroupUrl1Child);
79+
result.add(javarushVkGroupUrl2Child);
80+
result.add(javarushVkGroupUrl3Child);
81+
}
82+
return result;
83+
}
84+
85+
private void saveUnprocessedUrls(List<Runnable> unprocessed) {
86+
for (Runnable task : unprocessed) {
87+
urlsForProcessing.add(((UrlTask) task).getPage());
88+
}
89+
}
90+
91+
private void submitUrlTask(URL url) {
92+
executorService.execute(new UrlTask(url));
93+
}
94+
95+
public class UrlTask implements Runnable {
96+
private final URL url;
97+
98+
private UrlTask(URL url) {
99+
this.url = url;
100+
}
101+
102+
public void run() {
103+
for (URL link : processPage(url)) {
104+
if (Thread.currentThread().isInterrupted()) return;
105+
submitUrlTask(link);
106+
}
107+
}
108+
109+
public URL getPage() {
110+
return url;
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)