Мне интересно, как в файле threadlocal.set() нет данных, когда я устанавливаю его в набор из 32 элементов. ThreadLocal.get() всегда возвращает null; и соответствующий объект FutureTask имеет свойство result = NullPointerException. Любая идея, почему ThreadLocal не может хранить элементы коллекции?My ThreadLocal содержит и возвращает null всегда
public class MyCallable<T> implements Callable<Collection<T>> {
public MyCallable(Collection<T> items){
tLocal = new ThreadLocal<Collection<T>>();
tLocal.set(items); //SETS NULL ALTHOUGH the PARAMETER CONTAINS 32 ITEMS
}
@Override
@SuppressWarnings("unchecked")
public Collection<T> call() throws Exception {
synchronized(lock){
ArrayList<T> _items = new ArrayList<T>();
ArrayList<T> _e = (ArrayList<T>) tLocal.get(); //RETURNS NULL
for(T item : _e){
_items = getPValue(item));
}
return _items ;
}
}
private ThreadLocal<Collection<T>> tLocal;
private final Object lock = new Object();
}
использование сниппет:
List<Future<Collection<T>>> futures = new ArrayList<Future<Collection<T>>>();
ExecutorService pool = Executors.newFixedThreadPool(8);
for(int x = 0; x < numBatches; ++x){
List<T> items = retrieveNext32Items(x);
futures.add(pool.submit(new MyCallable<T>(items));
}
pool.shutdown();
for(Future<Collection<T>> future : futures) {
_items.addAll(future.get()); //future.outcome = NullPointerException
}
return _items
}
Вам следует добавить тег для C# или Java или что-то еще. – nwp