簡體   English   中英

Java 多線程和異步 Http 請求處理

[英]Java Multi-threading and Asynchronous Http Request Handling

這可能是一個非常籠統的問題,但無論如何我都會拍攝,因為我需要誠實的建議。 我有一個非常簡單的庫,由於大多數類是不可變的,因此它主要是線程安全的。 但是,我有 2-3 個沒有的類,我無法修改它們。

該庫廣泛用於異步 HTTP 客戶端。 它是這樣工作的。 客戶端使用觀察者進行實例化。 觀察者處理所有的完成、失敗或加載事件。 觀察者還從這個其他庫中調用必要的函數。

我正在使用異步 HTTP 客戶端,幾乎就像它在具有非阻塞 io 的單線程中運行一樣。 然而,在底層,客戶端使用線程池。

我的問題是:如果我使觀察者中的所有處理程序方法同步,這會解決所有其他線程安全問題嗎?

例如,我們有以下設置。

Client -> calls methods from the
   Observer
      synchronized onLoaded -> calls thread unsafe code
      synchronized onError -> calls thread unsafe code
      synchronized onCompleted -> calls thread unsafe code

如果這沒有意義,是否有可能以某種方式在主線程上執行這些方法中的所有代碼,從而實現我試圖遵循的非阻塞 io 設計?

澄清:我知道異步 HTTP 庫是基於線程和阻塞的,但代碼的 rest 不是......一切都基於事件。

只要另一個庫沒有/調用不安全的靜態方法,它就應該使其成為線程安全的。 這僅適用於有多個 Observers 對象並且可以並行調用它們的情況。 如果不是這種情況,那么應該沒問題。

除了添加同步之外,請檢查這三 (2) 種方法是否未修改 class 字段。 如果是,您可以使用 ThreadLocal。

用法:uniqueNum 是 class 字段,但它使用 ThreadLocal 聲明。 所以是安全的。

 import java.util.concurrent.atomic.AtomicInteger;

 public class UniqueThreadIdGenerator {

     private static final AtomicInteger uniqueId = new AtomicInteger(0);

     private static final ThreadLocal < Integer > uniqueNum = 
         new ThreadLocal < Integer > () {
             @Override protected Integer initialValue() {
                 return uniqueId.getAndIncrement();
         }
     };

     public static int getCurrentThreadId() {
         return uniqueId.get();
     }
 } // UniqueThreadIdGenerator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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