Привет, у меня проблема с потоком. Я хочу использовать один метод для n потока, и я не знаю, как это сделать. сделайте это так: у меня есть список новых объектов, которые выглядят следующим образом: я создаю класс (1), который реализует интерфейс Callable. Я использую это, потому что вызываемый поток не возвращает void. Далее у меня есть список строк (url). Затем я создаю список объектов, которые выглядят как class (1). затем я создаю исполнителя, и я хочу сделать поток в моем списке объектов 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();
}
1
на фактическое количество потоков, которое вы хотите использовать в вызовеnewFixedThreadPool()
. (2) Вам нужно использоватьinvokeAll()
, чтобы быть уверенным, что все ваши задачи выполнены и завершены;invokeAny()
выполняет все задачи, но ожидает завершения только одной из них, а затем отменяет остальные. - person Andrew Lygin   schedule 02.09.2016ivokeAny()
. Выполняет одну задачу и останавливается. Вам нужноinvokeAll()
. Но это не обязательно изменит время, он только выполнит больше работы, которая займет то же время или даже больше времени. Но, по крайней мере, все ваши изображения будут загружены. Теперь вы загружаете только одно изображение. - person Andrew Lygin   schedule 02.09.2016URLPathList
? - person Andrew Lygin   schedule 02.09.2016System.out.println(String.format("%d: URL %s", Thread.currentThread().getId(), "abc"))
вместоSystem.out.println("url " +url)
. Вы видите разные идентификаторы потоков? - person Andrew Lygin   schedule 02.09.2016