簡體   English   中英

並發遠程數據處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM