2015-08-12 7 views
1

Мне интересно, как в файле 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 
} 
+0

Вам следует добавить тег для C# или Java или что-то еще. – nwp

ответ

4

Вы создаете объект типа MyCallable в главном потоке затем представить их в пул потоков. Поэтому конструкторы MyCallable вызываются в одном потоке и методы call в другом. Поток локальный хранит отдельные данные для каждого потока, поэтому неудивительно, что вы получаете нули.

Я не понимаю, почему вы используете поток локальный. items должно быть простым полем в MyCallable. Если вы измените коллекцию, возможно, было бы лучше скопировать ее в новую коллекцию.

0

Значение, хранящееся в локальном потоке, сохраняется для конкретного потока. Поэтому, если вы сохраняете значение в потоке локально для определенного потока t1 и пытаетесь получить значение из другого потока t2, используя тот же поток local ..., вы не получите значение, но получите null. Проверьте, является ли поток, в котором значение задано в потоке локальный, - это тот же поток, из которого извлекается значение из потока local.