Bu yüzden bir URL'ye çok sayıda (10.000'den fazla) GET isteği göndermesi gerektiğini belirten bir programa sahibim ve olabildiğince hızlı olmamız gerekiyor. Programı ilk oluşturduğumda bağlantıları bir forma soktum ama gerçekten yavaştı çünkü devam etmeden önce her bağlantının tamamlanmasını beklemesi gerekecekti. Daha hızlı yapmak istedim, bu yüzden iplikleri kullanmayı denedim ve biraz daha hızlı yaptı ama yine de memnun değilim.Konuları Anlar + Eşzamansız
Bu konuda gitmenin ve gerçekten hızlı olmanın doğru yolunun asenkron bağlantı ve tüm URL'lere bağlanması olduğunu tahmin ediyorum. Bu doğru bir yaklaşım mı?
Ayrıca, iş parçacığı ve nasıl çalıştığını anlamaya çalışıyorum ama anlayamıyorum. Üzerinde bulunduğum bilgisayarın bir Intel Core i7-3610QM dört çekirdekli işlemci var. Intel'in bu işlemcinin özellikleri için web sitesine göre, 8 iş parçacığına sahip. Bu, bir Java uygulamasında 8 iş parçacığı oluşturabildiğim anlamına geliyor ve hepsi aynı anda mı çalışacak? 8'den fazla ve hız artışı olmayacak mı?
Sayı, "Performans" sekmesi altındaki görev yöneticisinde "Konular" ın yanında neyi temsil ediyor? Şu anda, görev yöneticim 1000'den fazla "Konular" gösteriyor. Neden bu sayı ve tüm işlemcim destekliyorsa 8'i nasıl geçebilir? Ayrıca, programımı 500 iş parçacığıyla bir sınama olarak denediğimde, görev yöneticisindeki sayının 500 arttığını, ancak bunun yerine 8 iş parçacığı kullanacak şekilde aynı hıza sahip olduğunu fark ettim. Bu yüzden sayı, Java uygulamamda kullandığım iş parçacığı sayısına göre artarsa, hız neden aynıdır?
Ayrıca, Java'da küçük bir test yapmayı denedim, ancak çıktı bana mantıklı gelmiyor.
Bu gibi bir çıktı üretirimport java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
private static int numThreads = 3;
private static int numLoops = 100000;
private static SimpleDateFormat dateFormat = new SimpleDateFormat("[hh:mm:ss] ");
public static void main(String[] args) throws Exception {
for (int i=1; i<=numThreads; i++) {
final int threadNum = i;
new Thread(new Runnable() {
public void run() {
System.out.println(dateFormat.format(new Date()) + "Start of thread: " + threadNum);
for (int i=0; i<numLoops; i++)
for (int j=0; j<numLoops; j++);
System.out.println(dateFormat.format(new Date()) + "End of thread: " + threadNum);
}
}).start();
Thread.sleep(2000);
}
}
}
:
[09:48:51] Start of thread: 1
[09:48:53] Start of thread: 2
[09:48:55] Start of thread: 3
[09:48:55] End of thread: 3
[09:48:56] End of thread: 1
[09:48:58] End of thread: 2
Neden ve hemen üçüncü iplik başlangıç biter ise birinci ve ikinci 5 saniye her sürebilir İşte benim Testi sınıftır? Eğer 3 iş parçacığı daha eklerseniz, aynı şey 2'nin üstündeki tüm iş parçacıkları için de geçerlidir.
Eğer bu çok uzun bir okuma olsaydı üzgünüm, çok fazla soru vardı. Şimdiden teşekkürler.
Yanıt için teşekkürler. Düzenleme ... – user1203585
Ahh, aslında bu yorumu düzenleyemiyorum ... 5 dakika sınırı ... "Tüm parçacıkların paylaştığı herhangi bir nesne var mı? Bu nesnede herhangi bir senkronize yöntem var mı?" Tüm iş parçacıklarım aynı şeyi yapıyor: Bir URL nesnesini başlatır ve bağlantıyı bir proxy ile açar. URLConnection bağlan ve okuma zaman aşımlarını ayarlar. Daha sonra URLConnection'dan okumak için bir BufferedReader ve InputStreamReader kullanır. Son olarak, bir metin dosyasına bir kelime yazar. Her iş parçacığının yaptığı budur ve bu iş parçacıklarının 500'ü bunu hızlandırıyor gibi görünmüyor:/ – user1203585
Biraz etrafta kazdım. Java'nın boyut olarak sınırlı bir temel bağlantı havuzuna sahip olduğundan şüpheleniyorum. Http.maxConnections adlı bir ağ özelliği vardır. [Http://docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html]. Varsayılan 5'dir. Bu, 5'ten fazla bağlantı açık olduktan sonra, aynı 5 altta yatan soketi (paylaşılan kaynaklar) ve sonra açacağınız tüm bağlantıları engelleyecektir. Yine, bunu onaylamak için JVisualVM'yi kullanabilirsiniz. – Pace