我有一个迭代链接列表的类。对于每个链接,我想做一个治疗。所以我必须为每个链接创建一个线程。
这是代码(Main):
ThreadProcessing tp;
for(int i = 0; i < listUrl.size(); i++)
{
tp.add(string_url);
}
对于ThreadProcessing类,我必须使用Executor接口。 关键是:我必须创建一个包含30个线程的池。 ThreadP类包含一个非阻塞线程列表(当然它可以包含30个以上的线程)。您可以根据需要添加任意数量的线程,该类将负责执行所有这些线程。
这就是我尝试做的事情(它不起作用).ThreadProcessing类:
public class ThreadProcessing {
List<Runnable> runnables = new ArrayList<Runnable>();
ExecutorService pool;
@PostConstruct
public void init()
{
pool = Executors.newFixedThreadPool(30);
}
public void add(String url)
{
runnables.add(createRunnable(url));
executeRunnables(pool, runnables);
}
public static void executeRunnables(final ExecutorService service, List<Runnable> runnables){
for(Runnable r : runnables){
service.execute(r);
}
service.shutdown();
}
private Runnable createRunnable(final String url){
Runnable getContentFromURL = new Runnable(){
public void run(){
//My treatment with url
}
};
return getContentFromURL;
}
}
我希望我的解释不会太模糊,谢谢。
答案 0 :(得分:0)
public void add( String url) {
Runnable job = createRunnable(url);
runnables.add( job);
pool.execute( job);
}
此外,除非您完成提交/添加作业,否则请勿关闭池。当然,在这个例子中,你并不真正需要runnables List。
答案 1 :(得分:0)
尝试类似:
public void main() {
ExecutorService es = Executors.newFixedThreadPool(30);
BlockingQueue<String> urls =
new ArrayBlockingQueue<String>(listUrl.size(), false, listUrl);
LinkedList<Future<?>> futures = new LinkedList<Future<?>>();
for(int i = 0 ; i < 30 ; ++i) {
futures.add(es.submit(new URLRunnable(urls)));
}
// Wait for all the futures to return
for(Future<?> f : futures) {
f.get();
}
}
public class URLRunnable() implements Runnable() {
private final BlockingQueue<String> urls;
URLRunnable(BlockingQueue<String> urls) { this.urls = urls; }
@Override
public void run() {
String url = null;
while((url = urls.poll()) != null) {
// do something with url
}
}
}