2016-04-13 33 views
1

'daki Executors.newFixedThreadHavuz'da kullanılabilir işlemcileri ayarlayın Aynı anda birden çok isteği ele alması gereken bir HTTPServer yapıyorum.HTTPServer

böyle görünüyor inşa ne ana işlevi:

public static void main(String[] args) throws Exception { 
    HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); 
    server.createContext("/", new MyRequestDispatcher()); 

    server.setExecutor(Executors.newCachedThreadPool()); 
    server.start(); 
} 

Şimdi üzerinde düşünüyorum nasıl oluşturulan iş parçacığı sayısını ilişkin bu Executors.newCachedThreadPool() çalışır. Oluşturulacak iş parçacığı sayısının sınırlı olmadığını okurken, aynı anda binlerce istek alırsam, binlerce iş parçacığı oluşturur mu?

Çalıştırılmakta olan makinede doğru şekilde işlenebilmesi için aynı anda oluşturulmuş iş parçacığı sayısını sınırlamayı düşünüyorum. Böyle bir şey üzerinde düşündü:

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) 

gol sisteminde mevcut işlemciler bağlı parçacığı yalnızca oluşturmak belirli sayıda etmektir.

Bu işe yarar mı?

Şimdiden teşekkürler!

+1

İsterseniz, ancak iş parçacığı engelleyen herhangi bir şey yaparsa, en iyisi bu olmayabilir - daha fazla iş parçacığınız varsa, engellenenler beklerken işiniz olabilir. Önbelleğe benzer iş parçacığı havuzundaki iş parçacığı sayısına her zaman bir sınır koyabilirsiniz - "Executors.newCachedThreadPool()" ve "Executors.newFixedThreadPool (int)" uygulamasına bakın. –

+0

Teşekkürler Andy! Onlara bir göz atacağım –

cevap

4

Evet, işe yarayacak ve en sık önerildiğin şey bu.

Özel kullanım durumunuza bağlı olarak farklı bir numara kullanmak isteyebilirsiniz.

  • Görevleriniz engelleniyorsa (örneğin G/Ç işlemlerinden dolayı), kullanılabilir çekirdeklerden daha fazla iş parçacığından yararlanabilirsiniz.
  • Çekirdek başına birden fazla donanım iş parçacığı çalıştırabilirsiniz, ayrıca kullanılabilir çekirdeklerden daha fazla iş parçacığı yararlanabilir. Örneğin, Hyperthreading özellikli Intel x86 Xeons, çekirdek başına 2 iş parçacığı, IBM POWER8 ve Oracle SPARC M7 çalıştırabilir - çekirdek başına en fazla 8 iş parçacığı.
  • Eşzamanlı GC toplayıcıları çalıştırıyorsanız, önemli bir GC basıncıyla karşılaşırsınız ve kesintisiz çalışan bir iş parçacığı havuzunuz vardır, havuzdaki iş parçacığı sayısının biraz düştüğünü size daha tatlı bir noktada taşıyabilirsiniz. Bu oldukça spesifik bir örnektir, ancak bahsettiğim, şu an üzerinde çalıştığım sistemde büyük bir vahiy olduğu için.
+0

Teşekkürler Dimitar, Eğer herhangi bir makinede çalışırken ortalama "en iyi" performansa sahip olmak istiyorsam ne düşünüyorsun? Eğer özellikleri bilmiyorsam, yukarıdaki örnekte belirttiğim yürütmenin takip edilmesi en iyi yaklaşım olacağını düşünüyor musunuz? –

+0

Kısa cevap: * Evet *. Uzun cevap: Bu ayrıntı düzeyinde (hiçbiri), bu akılcı kural bile son derece spekülatiftir. Bir arkadaşınızın doğum günü için en iyi hediyenin "En iyi düğün ve doğum günü hediyeleri" İnternet anketinde en iyi seçim olmasını beklemiyorsunuz değil mi? Yine de, daha sık, 'Runtime.getRuntime(). AvailableProcessors()' iş parçacığı havuzu boyutunu gerçek sorun değil. Eğer öyleyse, bunu kanıtlamanız gerekir, sonra kök neden olur, sonra bir çözüm bulun - ve bu başka bir tartışmanın konusudur :) –