问题描述
我是 Java 新手,而且我的知识确实很少。 然而,我的大学对我们有点苛刻。他们还没有教我们任何关于线程的知识。但是,他们要求我们提供一个包含线程的项目。 所以,我需要一些帮助。 这是一个网页检查器项目。 我创建了一个用于验证的类。它有一个 (ExecutorService) 作为实例变量,在构造函数中初始化。在该类中有一个 public void (URLsValidation) 方法,它创建一个新线程并在 ExecutorService 中执行它在 for 循环中:
t1 = new ValidationThreads(incompleteLink,currentDepth + 1,stopAtDepth,clickTextTemp);
es.execute(t1);
当在一个框架中调用这个方法时,它下面的代码行在方法中的线程完成之前执行,给出错误的结果,因为它们的结果是基于线程的完成。 我不知道如何解决这个问题。 我的代码如下: URLSValidation 方法:
(valid、invalid是类中的实例变量,用来统计有效链接和无效链接的个数)
public void URLsValidation(String link,int currentDepth,int stopAtDepth,String clickableText) throws IOException,InterruptedException {
ValidationThreads t1 = null,t2 = null;
if (singleURLIsValid(link)) //singleURLIsValid is a method that checks the validity of a single link
{
valid++;
System.out.println("Link: " + link + "\nText: " + clickableText);
System.out.println("Valid Link\n\n");
//base case for recursion
if (currentDepth == stopAtDepth)
return;
//getting next depth links
Document page = Jsoup.connect(link).get(); //opening the web document
Elements anchor = page.select("a[href]"); //getting anchor tags
String clickTextTemp;
for (int i = 0; i < anchor.size(); i++)
{
String incompleteLink = anchor.get(i).attr("href");
incompleteLink = WebPageExtractions.joinParentLink(link,incompleteLink);
Element temp = anchor.get(i);
clickTextTemp = WebPageExtractions.getClickableText(temp);
t1 = new ValidationThreads(incompleteLink,clickTextTemp);
es.execute(t1);
}
} else {
invalid++;
System.err.println("Link: " + link);
System.err.println("Invalid Link\n\n");
}
}
Validation v = new Validation(4); //the instance from that class
String link = url.getText(); //getting the link from a textfield
String d = depth.getText(); //getting the depth from a textfield
int depth = Integer.parseInt(d);
//calling the method to validate
v.URLsValidation(link,depth,"????");
System.out.println(v.valid + " " + v.invalid);
v.valid 和 v.invalid 在方法中的线程结束之前打印,因此它们给出错误的值
任何提示如何解决这个问题? 考虑到我对线程的了解为 0,到目前为止我使用的所有东西都是我在谷歌上搜索过的东西。 提前致谢!!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)