gpt4 book ai didi

java - 在 T Callable Class 的 call 方法中实例化一个类

转载 作者:行者123 更新时间:2023-12-01 15:31:56 25 4
gpt4 key购买 nike

基本上我有一个 ExecutorService 使用的小线程类和一个固定的线程池。每个线程实例化我的线程类并触发调用方法,效果很好!

但是,我确实需要调用另一个类(通过实例化或静态方式)来处理并返回调用方法中的一些数据,但是在尝试此操作时,我可以理解地得到了并发。 ExecutionException 以及相关方法。

我认为将我的所有代码粘贴到这里会更容易,请注意它非常粗糙

主 Controller

package com.multithreading.excutorservice;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class MainController {


private static List<String> urls;

public static void main(String[] args) {

populateList();
// futures to retrieve task results
List<Future<ArrayList>> futures = new ArrayList<Future<ArrayList>>();
// results
List<ArrayList> results = new ArrayList<ArrayList>();
// pool with 5 threads
ExecutorService exec = Executors.newFixedThreadPool(5);

// enqueue tasks
for(String url: urls) {
futures.add(exec.submit(new ThreadTask(url)));
}

// attempt to move ArrayLists within Future<ArrayList> into a normal ArrayList
for(Future<ArrayList> future: futures) {
try {
results.add(future.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


// for(ArrayList<String> s: results) {
// System.out.println(s);
// }
}

private static void populateList() {
urls = new ArrayList<String>();

urls.add("http://www.google.com");
urls.add("http://www.msn.co.uk");
urls.add("http://www.yahoo.co.uk");
urls.add("http://www.google.com");
urls.add("http://www.msn.co.uk");
urls.add("http://www.yahoo.co.uk");
}

}

线程任务

package com.multithreading.excutorservice;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;



public class ThreadTask implements Callable<ArrayList> {
private String url;
HtmlParser parseHtml;

public ThreadTask(String url) {
this.url = url;
}

public ArrayList call() {

int counter = 0;
String html = null;

try {
URL myUrl = new URL(url);
BufferedReader reader = new BufferedReader(new InputStreamReader(myUrl.openStream()));

while ((html = reader.readLine()) != null) {
//counter += inputLine.length();
html += html;
}
}
catch (Exception ex) {
System.out.println(ex.toString());
}

ArrayList<String> storeLinks = new ArrayList<String>();
HtmlParser par = new HtmlParser();
storeLinks = par.returnNewUrls(html);

// for(String s: parseHtml) {
// System.out.println(s);
// }

//returns an ArrayList of URLS which is stored in a List<Future<ArrayList>> temporarily
return storeLinks;

}
}

Html解析器

package com.multithreading.excutorservice;

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HtmlParser {

private final String regex_links = "\\s*(?i)href\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+))";
private ArrayList<String> extractedUrls;

public ArrayList<String> returnNewUrls (String data) {

extractedUrls = new ArrayList<String>();

Pattern p = Pattern.compile(regex_links);
Matcher m = p.matcher(data);
System.out.println("Test");

while (m.find()) {
System.out.println("Test");
extractedUrls.add(m.group(1));

}

return getLinks();
}

//returns the links
public ArrayList getLinks() {
return extractedUrls;
}
}

最佳答案

你在这里做了一些非常奇怪的事情。多个线程正在访问同一个静态 extractUrls 字段,并且每次调用 returnNewUrls 都会创建一个新字段。在 returnNewUrls 方法中,创建一个新的 ArrayList,它位于方法范围内。大致如下:

public static ArrayList<String> returnNewUrls(String data) {
ArrayList<String> urls = new ArrayList<String>();
addStuffToUrlsList();
return urls;
}

另一件事 - 不是错误,但您正在做不必要的事情 - 在调用方法中,如果您只是分配给变量,则不需要创建新列表:

ArrayList<String> parseHtml = new ArrayList<String>();
parseHtml = HtmlParser.returnNewUrls(html);

这样更好:

ArrayList<String> parseHtml = HtmlParser.returnNewUrls(html);

关于java - 在 T Callable Class 的 call 方法中实例化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9452534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com