아래 코드는 제품 객체의 arraylist를 각 제품의 입력, 회전 스레드로 가져오고 (arraylist '제품'에 제품을 추가), 제품 이미지 (product.imageURL) 가용성, 이미지없이 제품을 제거 (arraylist '제품'에서 제품을 제거), 그리고 이미지 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();
}
}
호출 문 : addProduct (제품) getProductsWithImageOnly() 내에서 호출 여기
displayProducts = new ProductFilterThread().getProductsWithImageOnly(displayProducts);
, getProducts()는 제품 목록을 반환하지만 그 경우 (제품이 없습니다 아니다 리턴 된) 메소드가 removeProduct() 메소드를 스레드에 의해 호출 될 때, 이미지가없는 제품이 절대로 제거되지 않기 때문입니다. 따라서 포함 된 제품에 이미지가 있는지 여부에 관계없이 모든 제품이 모듈에 의해 반환됩니다.
여기에서 문제가 될 수있는 것은 무엇입니까?
미리 감사드립니다. James, James.
감사합니다. 그러나 나는 걸리는 시간이 엄청나게 걸렸다는 것을 알아 차렸다. 추가 매개 변수 때문일 수 있습니까? – James
아니요, 데이터 구조의 오버 헤드와 동기화로 인해 발생했을 가능성이 큽니다. 스레드 풀을 사용하면 스레드 풀을 사용하는 것이 더 좋을 것입니다. 스레드 풀은 컴퓨터에 코어를 가지고있는 것처럼 대략 많은 스레드를 실행합니다. – aioobe
... 그리고 힙이 효율적입니까? – James