I want to apply ExecutorService for recursive read path from url in the format given,I had difficulty trying to recall recursive getRecursive(element.attr("abs:href"), level);
public class NewClass {
static String levels[] = {"div.col-md-9 li a", "div#sidebar ul li a"};
private void getRecursive(String href,int level) {
if (level > levels.length - 1) {
return;
}
Document doc;
try {
doc = Jsoup.connect(href).get();
Elements elements = doc.select(levels[level]);
level++;
ExecutorService executor = Executors.newFixedThreadPool(5);
for (final Element element : elements) {
executor.execute(new Runnable() {
@Override
public void run() {
if (!element.attr("href").isEmpty()) {
String links = "";
links += element.attr("abs:href") + "\n";
System.out.println(links);
getRecursive(element.attr("abs:href"), level);
}
}
});
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static void main(String[] args) {
new NewClass().getRecursive("http://www.java2s.com/", 0);
}
}
The level
variable has to be final
in order to access it in the run()
method. In any case, your not using ExecutorService
correctly, your program is not limited to 5
threads because you're creating a new ExecutorService
every time you call the getRecursive(...)
method.
To use the same ExecutorService
for every recursion, you can do something like this:
public class NewClass {
static String levels[] = { "div.col-md-9 li a", "div#sidebar ul li a" };
static String links = "";
private void getRecursive(String href, int level, final ExecutorService executor) {
if (level > levels.length - 1) {
return;
}
Document doc;
try {
doc = Jsoup.connect(href).get();
Elements elements = doc.select(levels[level]);
final int flevel = ++level;
for (final Element element : elements) {
executor.execute(new Runnable() {
@Override
public void run() {
if (!element.attr("href").isEmpty()) {
links += element.attr("abs:href") + "\n";
System.out.println(links);
getRecursive(element.attr("abs:href"), flevel, executor);
}
}
});
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
new NewClass().getRecursive("http://www.java2s.com/", 0, executor);
}
}