Vì vậy, tôi có một chương trình mà tôi đã thực hiện cần phải gửi rất nhiều (như 10.000+) yêu cầu GET tới một URL và tôi cần nó càng nhanh càng tốt. Khi tôi lần đầu tiên tạo ra chương trình tôi chỉ cần đặt các kết nối vào một vòng lặp for nhưng nó đã thực sự chậm vì nó sẽ phải chờ đợi cho mỗi kết nối để hoàn thành trước khi tiếp tục. Tôi muốn làm cho nó nhanh hơn vì vậy tôi đã thử sử dụng các chủ đề và nó làm cho nó hơi nhanh hơn nhưng tôi vẫn không hài lòng.Tìm hiểu Chủ đề + Không đồng bộ
Tôi đoán đúng cách để thực hiện điều này và làm cho nó thực sự nhanh chóng bằng cách sử dụng kết nối không đồng bộ và kết nối với tất cả các URL. Đây có phải là cách tiếp cận đúng?
Ngoài ra, tôi đã cố gắng hiểu chủ đề và cách chúng hoạt động nhưng tôi dường như không thể hiểu được. Máy tính tôi đang sử dụng có bộ xử lý lõi tứ Intel Core i7-3610QM. Theo trang web của Intel cho các chi tiết kỹ thuật cho bộ xử lý này, nó có 8 chủ đề. Điều này có nghĩa là tôi có thể tạo 8 luồng trong một ứng dụng Java và tất cả chúng sẽ chạy đồng thời không? Bất kỳ hơn 8 và sẽ không có tăng tốc độ?
Chính xác số nào đại diện cho "Chủ đề" trong trình quản lý tác vụ trong tab "Hiệu suất"? Hiện tại, người quản lý tác vụ của tôi đang hiển thị "Chủ đề" là hơn 1.000. Tại sao nó là con số này và làm thế nào nó có thể thậm chí đi qua 8 nếu đó là tất cả các bộ vi xử lý của tôi hỗ trợ? Tôi cũng nhận thấy rằng khi tôi thử chương trình của tôi với 500 chủ đề như một bài kiểm tra, con số trong trình quản lý tác vụ tăng 500 nhưng nó có cùng tốc độ như tôi đặt nó để sử dụng 8 chủ đề thay thế. Vì vậy, nếu số lượng đang tăng theo số lượng chủ đề tôi đang sử dụng trong ứng dụng Java của tôi, thì tại sao tốc độ lại giống nhau?
Ngoài ra, tôi đã thử thực hiện một thử nghiệm nhỏ với các chuỗi trong Java nhưng đầu ra không có ý nghĩa với tôi. Đây là class Test của tôi:
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);
}
}
}
Điều này tạo ra một sản lượng như:
[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
Tại sao khi bắt đầu chủ đề thứ ba và kết thúc ngay lập tức trong khi người đầu tiên và thứ hai mất mỗi 5 giây? Nếu tôi thêm nhiều hơn 3 chủ đề, cùng một điều xảy ra cho tất cả các chủ đề ở trên 2.
Xin lỗi nếu điều này đã được đọc lâu, tôi có rất nhiều câu hỏi. Cảm ơn trước.
Cảm ơn bạn đã trả lời. Chỉnh sửa ... – user1203585
Ahh, tôi không thể chỉnh sửa nhận xét đó thực sự ... giới hạn 5 phút ... "Có đối tượng nào mà tất cả các chuỗi chia sẻ không? Đối tượng này có bất kỳ phương pháp đồng bộ nào không?" Tất cả các chủ đề của tôi đang thực hiện tương tự: Nó khởi tạo đối tượng URL và mở kết nối với proxy. Nó đặt URLConnection kết nối và đọc hết thời gian chờ. Sau đó, nó sử dụng một BufferedReader và InputStreamReader để đọc từ URLConnection. Cuối cùng, nó viết một từ vào một tập tin văn bản. Đó là những gì mỗi chủ đề đang làm và chạy 500 trong số các chủ đề này dường như không tăng tốc độ:/ – user1203585
Tôi đã thực hiện một số việc đào bới. Tôi nghi ngờ rằng Java có một hồ bơi kết nối cơ bản được giới hạn về kích thước. Có một thuộc tính mạng có tên http.maxConnections [xem tại đây] (http://docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html). Mặc định là 5. Điều này có nghĩa là sau khi bạn có nhiều hơn 5 kết nối mở, tất cả chúng đều sử dụng cùng 5 ổ cắm cơ bản (tài nguyên được chia sẻ) và bất kỳ kết nối nào bạn mở sau đó sẽ chặn. Một lần nữa, bạn có thể sử dụng JVisualVM để xác nhận điều này. – Pace