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()
调用,让执行程序进行实际下载。
您好,线程有问题。我想为 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()
调用,让执行程序进行实际下载。