【发布时间】:2010-06-14 07:40:54
【问题描述】:
下面的代码旨在将产品对象的arraylist作为输入,为每个产品旋转线程(并将产品添加到arraylist'products'),检查产品图像(product.imageURL)的可用性,删除产品没有图片(从 arraylist 'products' 中删除产品),并返回一个带有可用图片的产品的 arraylist。
package com.catgen.thread;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.catgen.Product;
import com.catgen.Utils;
public class ProductFilterThread extends Thread{
private Product product;
private List<Product> products = new ArrayList<Product>();
public ProductFilterThread(){
}
public ProductFilterThread(Product product){
this.product = product;
}
public synchronized void addProduct(Product product){
System.out.println("Before add: "+getProducts().size());
getProducts().add(product);
System.out.println("After add: "+getProducts().size());
}
public synchronized void removeProduct(Product product){
System.out.println("Before rem: "+getProducts().size());
getProducts().remove(product);
System.out.println("After rem: "+getProducts().size());
}
public synchronized List<Product> getProducts(){
return this.products;
}
public synchronized void setProducts(List<Product> products){
this.products = products;
}
public void run(){
boolean imageExists = Utils.fileExists(this.product.ImageURL);
if(!imageExists){
System.out.println(this.product.ImageURL);
removeProduct(this.product);
}
}
public List<Product> getProductsWithImageOnly(List<Product> products){
ProductFilterThread pft = null;
try{
List<ProductFilterThread> threads = new ArrayList<ProductFilterThread>();
for(Product product: products){
pft = new ProductFilterThread(product);
addProduct(product);
pft.start();
threads.add(pft);
}
Iterator<ProductFilterThread> threadsIter = threads.iterator();
while(threadsIter.hasNext()){
ProductFilterThread thread = threadsIter.next();
thread.join();
}
}catch(Exception e){
e.printStackTrace();
}
System.out.println("Total returned products = "+getProducts().size());
return getProducts();
}
}
调用语句:
displayProducts = new ProductFilterThread().getProductsWithImageOnly(displayProducts);
这里,当从 getProductsWithImageOnly() 中调用 addProduct(product) 时,getProducts() 返回产品列表,但当线程调用方法 removeProduct() 时,情况并非如此(不返回任何产品),因此,没有图像的产品永远不会被删除。结果,无论包含的产品是否有图像,模块都会返回所有产品。
这可能是什么问题?
提前致谢。 詹姆斯。
【问题讨论】:
标签: java multithreading