[英]Concurrent Remote Data Processing
我正在編寫一個Java項目,在該項目中,用戶可以一次提交多個查詢,並且這些查詢被同時調度以在我的一台服務器上進行處理。
為了舉例說明,假設用戶一次輸入多個帳號。 該程序應將這些帳號中的每個帳號單獨發送到我的服務器,並等待處理結果。 當服務器返回每個結果時,程序將更新Java Swing JList以將這些結果顯示給用戶。
因此,假設用戶輸入:
00001
00002
00003
00004
然后,該程序將同時調度4個不同的請求到:
http://example.com/process_account.php?accountNumber=00001
http://example.com/process_account.php?accountNumber=00002
http://example.com/process_account.php?accountNumber=00003
http://example.com/process_account.php?accountNumber=00004
然后,當服務器完成結果時,結果將在jlist_AccountResults
顯示給用戶。 因此服務器可能會返回: 43
到帳戶00004
請求; 12
到帳戶00002
請求; 36
向賬戶00001
請求; 和29
到帳戶00003
請求。 這樣,輸出將類似於:
Account 00004: 43
Account 00002: 12
Account 00001: 36
Account 00003: 29
此處的關鍵點在於,結果將在可用時立即顯示,並且處理是並發的,而不是順序的。
當前,程序可以順序處理多個查詢,但是當查詢列表很長時,處理可能會花費很長時間。 當然,總的處理時間隨着查詢數量的增加而增加,但是,例如,如果程序一次可以處理4個查詢,則將大大減少總時間。
為了解決這個問題,我一直在考慮使用多線程或ExecutorService,但我很想聽聽一些替代想法。 如果任何人都可以提供示例或指向處理類似問題的示例的鏈接,將不勝感激。
先感謝您。
ExecutorService
是多線程的,它似乎是完成該任務的正確工具。 如果您了解有關線程的基礎知識並將線程之間的通信限制到最少,則這應該是最簡單的選擇。 我會做這樣的事情:
public static void get(URI[] uris) {
ExecutorService executor = Executors.newFixedThreadPool(4);
for (final URI uri : uris) {
executor.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
InputStream input = uri.toURL().openStream();
try {
Result result = readIntput(input);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
// notify UI
}
});
} finally {
input.close();
}
return null;
}
});
}
}
異步IO是另一種選擇。 例如: AsyncHttpClient 。 但這歸結為同一件事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.