2016-01-31 19 views
5

MongoDB Async Java Sürücüsünü Kullanırken: Aşağıdaki geriçağırımın bir AtomicInteger sayacı kullanması mı yoksa normal bir int işi mi yapması gerekiyor?MongoCollection.forEach'in iş parçacığı güvenli olması gerekiyor mu?

Block<Document> theBlock = new Block<Document>() { 
    AtomicInteger counter = new AtomicInteger(); 
    @Override 
    public void apply(final Document document) { 
    counter.incrementAndGet(); 
    } 
}; 
SingleResultCallback<Void> callbackWhenFinished = ... 

collection.find().forEach(theBlock, callbackWhenFinished); 

cevap

2

MongoDB Java API ve async muadili arasındaki tek fark, ikinci yöntemleri engellenmeyen ve bağımsız değişkenler olarak geri arama almasıdır. Bu, geri çağrınızda aldığınız öğenin, eşit olmayan API'da yöntemin döndürdüğü anlamına gelir.

Burada find yöntemini kullanırsınız. Bir "normal" yinelenebilir döndürür, bu nedenle forEach'u çağırmak, birden çok iş parçacığına neden olmaz. Aynı iple, sizin apply yöntemi denir sırayla: Başka bir deyişle

, bir AtomicInteger gerekmez.


yine aşağıdakilerden birini yapabilirsiniz, şüphelerim var ya da bir "kanıt" gerekirse:

  1. senin bloğunun içinde bir System.out.println(Thread.currentThread().getName()); ekleyin. Her zaman aynı iş parçacığı tarafından gerçekleştirilir göreceksiniz;
  2. Yalnızca iş parçacığını durdurmak için yapılandırılmış, blokunuzun içine bir kesme noktası ekleyin. Bir kez daha, kesme noktası tüm kodu engelleyecektir.