定义了一个并行收索类:
package thread;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
public class ConcurrencySearch {
private volatile static AtomicInteger result = new AtomicInteger(-1);
private T searchValue;
private int begin;
private int end;
private CopyOnWriteArrayList array;
public ConcurrencySearch(CopyOnWriteArrayList<T> array,T searchValue,int begin ,int end){
this.array = array;
this.searchValue = searchValue;
this.begin = begin;
this.end = end;
}
public int getValue(){
System.out.println(Thread.currentThread().getName());
for (int i = begin; i < end; i++) {
System.out.println(Thread.currentThread().getName() +"==>"+i+"-"+array.get(i)+"-"+searchValue+"==?"+(array.get(i) == searchValue));
if(result.get() > 0){
return result.get();
}
if(array.get(i) == searchValue){
System.out.println(Thread.currentThread().getName()+"找到了值"+searchValue);
if(!result.compareAndSet(-1, i)){
result.get();
}
return i;
}
}
return -1;
}
}
然后做了测试用例,发现寻找的数据较小的时候都能够找到,如果稍微大一点就找不到了:
package thread;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class TEST {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(5);
final CopyOnWriteArrayList array = new CopyOnWriteArrayList<>();
final int sreachValue = 137;
for (int i = 0; i < 1000; i++) {
array.add(i);
}
long start = System.currentTimeMillis();
ArrayList> fs = new ArrayList<>();
int size = array.size() / 5 + 1;
for (int i = 0, l = 0; i < array.size(); i += size) {
l = i + size;
if(l > array.size()){
l = array.size();
}
final int temp = i;
final int end = l;
FutureTask f = new FutureTask(new Callable() {
@Override
public Integer call() throws Exception {
return new ConcurrencySearch<Integer>(array, sreachValue, temp, end).getValue();
}
});
es.submit(f);
fs.add(f);
}
es.shutdown();
for (int i = 0; i < fs.size(); i++) {
try {
System.out.println(fs.get(i).get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
// System.out.println(System.currentTimeMillis() - start);
}
}