Tak więc mam program, który zrobiłem, który musi wysłać dużo (np. 10 000+) żądań GET do adresu URL i potrzebuję go, aby był tak szybki, jak to możliwe. Kiedy po raz pierwszy stworzyłem program, po prostu wstawiłem połączenia do pętli for, ale było to naprawdę powolne, ponieważ przed kontynuowaniem trzeba było poczekać na zakończenie każdego połączenia. Chciałem zrobić to szybciej, więc próbowałem używać wątków i zrobiłem to trochę szybciej, ale wciąż nie jestem usatysfakcjonowany.Zrozumienie wątków + Asynchroniczny
Zgaduję, poprawny sposób, aby przejść o tym i bardzo szybko jest za pomocą asynchronicznego połączenia i łączenia się z wszystkimi adresami URL. Czy to właściwe podejście?
Staram się również zrozumieć wątki i sposób ich działania, ale nie mogę tego uzyskać. Komputer, na którym pracuję, ma czterordzeniowy procesor Intel Core i7-3610QM. Według strony internetowej Intela dla specyfikacji tego procesora, ma 8 wątków. Czy to oznacza, że mogę utworzyć 8 wątków w aplikacji Java i wszystkie będą działać jednocześnie? Czy jest więcej niż 8 i nie będzie wzrostu prędkości?
Co dokładnie oznacza numer obok "wątków" w menedżerze zadań w zakładce "Wydajność"? Obecnie mój menedżer zadań pokazuje "Wątki" jako ponad 1000. Dlaczego to jest ten numer i jak może przekroczyć 8, jeśli to wszystko obsługuje mój procesor? Zauważyłem także, że kiedy próbowałem mojego programu z 500 wątkami jako testem, liczba w menedżerze zadań wzrosła o 500, ale miała taką samą prędkość, jak gdybym ustawił go do używania 8 wątków zamiast. Więc jeśli liczba rośnie w zależności od liczby wątków, których używam w mojej aplikacji Java, dlaczego prędkość jest taka sama?
Próbowałem także zrobić mały test z wątkami w Javie, ale dane wyjściowe nie mają dla mnie sensu. Oto moja klasa Test:
import 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);
}
}
}
To powoduje wyjście takie jak:
[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
Dlaczego trzeci początek i koniec gwintu od razu, podczas gdy pierwszy i drugi ma 5 sekund każdego? Jeśli dodaję więcej niż 3 wątki, to samo dzieje się dla wszystkich wątków powyżej 2.
Przepraszam, jeśli to była długa lektura, miałem wiele pytań. Z góry dzięki.
Dzięki za odpowiedź. Edytowanie ... – user1203585
Ahh, nie mogę edytować tego komentarza w rzeczywistości ... 5-minutowy limit ... "Czy istnieje obiekt, który współdziałają wszystkie wątki? Czy ten obiekt ma jakiekolwiek zsynchronizowane metody?" Wszystkie moje wątki robią to samo: Powoduje utworzenie instancji obiektu URL i otwarcie połączenia z serwerem proxy. Ustawia limit czasu połączenia i odczytu URLConnection. Następnie używa BufferedReader i InputStreamReader do odczytu z URLConnection. Na koniec zapisuje słowo do pliku tekstowego. To, co robi każdy wątek i działa 500 z tych wątków nie wydaje się przyspieszyć:/ – user1203585
Zrobiłem trochę kopania wokół. Podejrzewam, że Java ma bazową pulę połączeń o ograniczonym rozmiarze. Istnieje właściwość sieciowa o nazwie http.maxConnections [patrz tutaj] (http://docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html). Wartość domyślna to 5. Oznacza to, że po otwarciu więcej niż 5 połączeń używają tych samych 5 bazowych gniazd (zasobów udostępnionych) i wszystkich połączeń, które zostaną otwarte po tym, jak zostaną zablokowane. Ponownie, możesz użyć JVisualVM, aby to potwierdzić. – Pace