Java中,有乙個for迴圈呼叫網路api很耗時,請問如何減少耗時?

時間 2021-05-07 19:34:28

1樓:碼神手記

典型的IO優化場景,核心思想是減少IO次數,提高並行度。

方法如下:

1、合併可以合併的請求,減少請求次數。

2、利用執行緒池,多個請求並行發起。注意設定超時時間,避免慢請求耗盡執行緒資源。

3、快取可以快取的資料,減少請求次數。

4、使用支援非同步化、NIO、多路復用的網路請求元件。比如基於netty的方案。

曾經用過乙個叫Vert.x的開發框架,非常適合IO密集場景,可以了解下。

2樓:

這裡有2個思路:

1.先看多次請求能否合併?

比如資料庫請求或者讓對方api支援批量呼叫2.如果請求無法合併,讓多次請求併發呼叫,最後總的介面響應時間約等於所有api裡最慢的那個,而不是所有api耗時累加。

這一點可以使用callable來實現

3樓:

上面很多人都有很好的解決方法了,例如修改api支援批處理啊,非同步啊之類的。

我有乙個比較簡單的方法:可以用parallelStream來遍歷,httpclient連線池來請求。

4樓:

好問題,第一看單個元素的介面能否盡可能的快,類似ping -t,第二看能否介面直接支援list,並且list介面也盡可能的快,最後再考慮執行緒非同步什麼的吧

5樓:

要看資料依賴性.

for迴圈中每一輪迭代是否用到上一輪中的結果了? for迴圈之後的邏輯是不是都強依賴for迴圈的結果?

6樓:朱涵俊

應該修改程式設計,改成非同步方式。多執行緒也是一種方案,但是消耗比較高。

比如for迴圈傳送100個檔案。

for (i=0;i<100;i++)sendfile(files[i]);

如果用同步,是乙個個傳送的,效率比較低,而且會卡住執行緒。

int done=0;

for(i=0;i<100;i++) {

sendfile_aio(files,ret=>{if (++done)==100)callback(done);

7樓:林咖啡

1.單步變批量

2.同步變異步

3.cache是萬能藥

具體一點來說就是,看能否使用下游服務的批量獲取介面,減少io次數;如果請求之間沒有依賴,使用執行緒池非同步的發起請求,用Future收集所有結果;如果請求結果是冪等的,可以考慮加個快取,下次就可以一次獲取;

Java裡乙個執行緒呼叫了Thread interrupt 到底意味著什麼?

快樂心靈知識站 有乙個很重要的事情,在Android 中會有點特殊,正常情況下,當執行緒中的run方法執行完畢後,執行緒是會自動關閉,不需要我們手動去關閉的。如 new Thread new Runnable start 而當run方法中的操作會不斷迴圈執行時如 newThread new Runn...

如何用asterisk搭建乙個呼叫中心?

PiGc 題目雖然簡單,但是實施起來是有難度的。題主應該需要的是乙個撥出型的呼叫中心。1.Asterisk 裡面提供SIP賬號,users.conf 和 sip.conf 需要配置。這一塊更多的是 Asterisk 設定。2.配置extensions.conf 裡面的撥號規則可以實現不同的撥出規則,...

這是乙個bug嗎 JAVA?

equals引數是乙個Object,首先判斷傳入是否為null,是null就直接返回false了,是判斷是否是同一物件的。 物件的值是空和空物件是不同的。比如String s null s是乙個引用,指向空物件。String s s是乙個引用,指向物件 只不過物件的值為空而已。兩者是不同的,乙個是空...