Java多線程學習處理高并發(fā)問題

Java多線程學習處理高并發(fā)問題

長沙中公優(yōu)就業(yè)      2022-04-09 15:07:01     1

Java多線程學習處理高并發(fā)問題,在程序的應用程序中,用戶或請求的數量達到一定數量,并且無法避免并發(fā)請求.由于對接口的每次調用都必須在返回時終止,因此,如

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細介紹

在程序的應用程序中,用戶或請求的數量達到一定數量,并且無法避免并發(fā)請求.由于對接口的每次調用都必須在返回時終止,因此,如果接口的業(yè)務相對復雜,則可能會有多個用戶.調用接口時,該用戶將凍結.

以下內容將介紹解決此問題的巧妙且非常簡單的方法.

請求寫入內存

我們可以將每個請求封裝為一個對象,然后將其寫入內存.

@Getter@Setterprivate static class CallVo{//請求對象     private Long param1;//參數1     private Integer param2;//參數2}private List<CallVo> callVoList = new ArrayList<>();//請求對象列表 @Transactional @RequestMapping(value = "/call",method = {RequestMethod.POST}) public void call(@RequestBody CallVo callVo){       synchronized (syncObject) {           callVoList.add(callVo);//將請求對象寫入內存       } }

多線程處理

創(chuàng)建一個線程以繼續(xù)讀取內存中的數據. 如果被請求對象的收集長度為0多線程技術問題解決,則表明沒有請求. 如果集合中有數據,請從集合中刪除請求的對象并獲取時間. 根據相應業(yè)務處理請求的參數.

這達到了將同步轉變?yōu)楫惒降哪康模⒑唵蔚亟鉀Q了高并發(fā)性的問題.

private Thread thread;private final Object syncObject = new Object(); // 同步對象private volatile boolean runnable; @Override public void run() {        while (runnable){            try {                if (callVoList.size() == 0) {//集合長度為0,證明沒有請求                    Thread.sleep(1000);                    continue;                }                CallVo callVo;                synchronized (syncObject) {                    callVo = callVoList.remove(0);                }                Long param1 = callVo.getStationId();                Integer param2 = callVo.getCallType();                              //業(yè)務處理                System.out.println(param1+"---"+param2);                           }catch (Exception e){                logger.error("接口調用異常:", e);            }        }  }

完整代碼

@RestController@Slf4j@RequestMapping("/erpRemote")public class ErpRemoteController extends baseController implements DisposableBean, Runnable{       ErpRemoteController(){        callVoList = new ArrayList<>();        runnable = true;        thread = new Thread(this);        thread.start();    }        @Transactional    @RequestMapping(value = "/call",method = {RequestMethod.POST})    public GeneralResponse call(@RequestBody CallVo callVo){                synchronized (syncObject) {            callVoList.add(callVo);//將請求對象寫入內存        }        return GeneralResponse.success(null);    }    @Getter    @Setter    private static class CallVo{//請求對象        private Long param1;//參數1        private Integer param2;//參數2    }    private List<CallVo> callVoList;    private Thread thread;    private final Object syncObject = new Object(); // 同步對象    private volatile boolean runnable;    @Override    public void run() {        while (runnable){            try {                if (callVoList.size() == 0) {//集合長度為0,證明沒有請求                    Thread.sleep(1000);                    continue;                }                CallVo callVo;                synchronized (syncObject) {                    callVo = callVoList.remove(0);                }                Long param1 = callVo.getStationId();                Integer param2 = callVo.getCallType();                              //業(yè)務處理                System.out.println(param1+"---"+param2);                }catch (Exception e){                logger.error("接口調用異常:", e);            }        }    }    @Override    public void destroy() {        runnable = false;    }}

限制

由于同步是異步的,因此每次請求接口的返回值都是唯一的多線程技術問題解決,因此此方法僅適用于請求者不需要返回的情況.

以上就是長沙中公優(yōu)就業(yè)Java培訓機構的小編針對“Java多線程學習處理高并發(fā)問題”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。

培訓啦提醒您:交易時請核實對方資質,對于過大宣傳或承諾需謹慎!任何要求預付定金、匯款等方式均存在風險,謹防上當。