我遇到以下情况:
如上所述,我想用10 其他线程同时处理图片。
目前我有一个自己列表的 Singleton 实现:
public class ImageList extends Observable implements Iterable<Image> {
private final BlockingQueue<Image> images = new LinkedBlockingQueue<Image>();
private static class InstanceHolder {
public static ImageList instance = new ImageList();
}
public static ImageList getInstance() {
return InstanceHolder.instance;
}
private ImageList() {
}
public synchronized void execute(Image job) throws InterruptedException {
images.put(job);
new Thread(job).start();
System.out.println("notify observers");
this.setChanged();
this.notifyObservers();
System.out.println(this.countObservers());
}
@Override
public Iterator<Image> iterator() {
return images.iterator();
}
}
一旦找到图像,我就会执行ImageList.execute(image)
,但我不喜欢这个解决方案,因为并行进程有没有上限(它可能会变成数千个)。
我的另一个想法是:
imagesFound
传递给我的所有抓取工具,让他们将所有图片添加到该列表中imagesFound
中的新元素并处理它们但是,我也不喜欢这个解决方案,因为线程传递一个不是真的需要的数组(但只是用来传回找到的数据)似乎错了对我来说。如果我想在网站上搜索20种不同的信息,它可能会成为20个不同的列表。
那么,你通常如何实现从线程返回数据(在我的情况下:特别是如果这些数据本身应由其他线程处理)。
答案 0 :(得分:4)
也许是线程池?查看ExecutorService。
示例:
class Task implements Callable<Object> {
private Image job;
public Task(Image job) {
this.job = job;
}
public Object call() {
// crawl
return result;
}
}
...
// Initialize thread pool
ExecutorService exec = Executors.newFixedThreadPool(10);
// every time you get a new job
Future<Object> result = exec.submit(new Task(job));
// when you want to collect the result
Object obj = result.get();