Java 可调用池线程同时完成所有工作

Java Callable Pool thread do it all on this same time

您好,线程有问题。我想为 n 个线程做一个方法,但我不知道该怎么做。这样做:我有如下所示的新对象列表: 我创建了一个实现接口 Callable 的 class(1) 我使用它是因为可调用线程不会 return void。接下来我有一个字符串列表(url) 接下来我创建一个看起来像 class (1) 的对象列表。接下来我创建一个执行程序,我想在我的 obcject n-thread

列表中执行线程
public class UtlToImageConverter implements Callable<BufferedImage> {

    private String url;
    private static BufferedImage image;

    public UtlToImageConverter(String url) {
        this.url = url;
        getImgFromPath(url);
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        UtlToImageConverter.image = image;
    }

    public static BufferedImage getImgFromPath(String path){
        if(TestURLImage4.imgCache.get(path) != null){
            return TestURLImage4.imgCache.get(path);
        }
        else{
            URL url = null;
            try {
                url = new URL(path);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            try {
                image = ImageIO.read(url);
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(TestURLImage4.imgCache.size());
            TestURLImage4.imgCache.put(path, image);
            return image;
        }
    }

    @Override
    public BufferedImage call() throws Exception {
        System.out.println("url  "  +url);
        getImgFromPath(url);
        System.out.println("url ok "  +url);
        return image;
    }

}

接下来我这样做:

ArrayList<UtlToImageConverter> threadList = new ArrayList<>(); 
            for(String url : URLPathList){
                threadList.add(new UtlToImageConverter(url));
            }
            ExecutorService executor = Executors.newFixedThreadPool(10);

        try {
//          executor.invokeAll(threadList, 1000L, TimeUnit.SECONDS);
            executor.invokeAll(threadList);
//          executor.invokeAny(threadList);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
//      } catch (ExecutionException e) {
//          e.printStackTrace();
        }       

问题是您从 UtlToImageConverter 的构造函数调用 getImgFromPath()。因此,在提交给执行程序之前,所有的图像都是在实例化过程中按顺序下载的。执行者只是从缓存中检索它们,所以你看不出有什么不同。从构造函数中删除 getImgFromPath() 调用,让执行程序进行实际下载。