1. 程式人生 > >java模擬高併發請求

java模擬高併發請求

實現高併發請求,即同一個程序開闢出多個執行緒請求相同的資源 ,再同時對一個資源進行訪問操作。 

我們都知道 要實現一個多執行緒的併發服務可以有兩種方式,一種是繼承 Theard  類 ,另一種是實現Runnable 介面  在java.lang.Theard 包中,可以看到Theard類也是實現了 Runnable 介面 的實現。

下文中 是通過實現Runnable 介面來完成多執行緒併發。

我這裡是實現一個模擬多使用者投標的一個model (投標多用於 p2p 網站中,借款人在平臺發起借款標,投資人可以對該借款標發起投標。)

本地配置的專案spring mvc 模式, web 伺服器為tomcat伺服器 ,

在web.xml 中配置監聽服務,所以已經啟動單一執行緒,在下例子中採用spring 註解, 在當前執行緒中啟動定時服務Scheduled,

/**

 * 
 */
package com.byzk.p2p.thread;


import java.util.HashMap;
import java.util.List;


import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.byzk.p2p.admin.base.controller.BaseController;
import com.byzk.p2p.admin.base.util.MD5;
import com.byzk.p2p.admin.user.dao.UserAccountDao;
import com.byzk.p2p.admin.user.dto.User;
import com.byzk.p2p.admin.user.service.UserService;


/***
 * <p>
 * Title:CurrentTime
 * </p>
 * <p>
 * Description:定時執行
 * </p>
 * <p>
 * Company:xbd
 * </p>
 * 
 * @author:Administrator
 * @date:2016年11月2日下午4:29:07
 */
@Component
public class CurrentTime extends BaseController {


@Autowired
private UserService userService;
@Autowired
private UserAccountDao userAccount;


private static Logger logger = Logger.getLogger(CurrentTime.class);


@Scheduled(cron = "0 59 14 * * ? ")
public void execute() {
// 查詢所有使用者
Integer index =0;
List<User> userList = userService.listAll1(new HashMap<String, Object>());
try {
if (userList != null && userList.size() > 0) {
for (User user : userList) {
TestThread runnable = new TestThread();
if (StringUtils.isNotBlank(user.getFuionAccount()) && "N".equals(user.getFuionAccount())) {
continue;
}
   if(index>=15){
   break;
   }
runnable.setUserId(user.getId());
runnable.setBorrowId(12230);
runnable.setAmount(100.00);
runnable.setThread(runnable);
if(StringUtils.isNotBlank(user.getDealPassword()) && MD5.GetMD5Code("jx123456").equals(user.getDealPassword())){
runnable.setPassword("jx123456");
}
   if(StringUtils.isNotBlank(user.getDealPassword()) &&MD5.GetMD5Code("jx654321").equals(user.getDealPassword())){
runnable.setPassword("jx654321");
   }
new Thread(runnable).start();
logger.info(Thread.currentThread().getName() + "使用者【" + user.getUsername() + "】發起投標請求"); index++;
}
}
} catch (Exception e) {
}
}

        這是一個新的程式入口, 測試兩個執行緒的併發。


/**

* <p>Description:程式入口主函式 </p>
* <p>Company:xbd </p>
* @author:lilei
* @date:2016年11月4日下午2:14:40
*/
public static void main(String []args){
TestThread t = new TestThread();
// 使用者1
t.setUserId(2381);
t.setAmount(200.00);
t.setBorrowId(12230);
t.setPassword("jx123456");
t.setThread(t);
new Thread(t).start();

TestThread t1 = new TestThread();
// 使用者2
t1.setUserId(15167);
t1.setAmount(100.00);
t1.setBorrowId(12230);
t1.setPassword("jx654321");
t1.setThread(t1);
new Thread(t1).start();

}

}

/**
 * 
 */
package com.byzk.p2p.thread;


import org.apache.log4j.Logger;


import com.byzk.p2p.admin.fuiou.config.Config;
import com.byzk.p2p.admin.fuiou.util.WebUtils;
import com.byzk.p2p.admin.user.dto.User;
/*** <p>Title:MtThread </p>
* <p>Description: </p>
* <p>Company:xbd </p>
* @author:Administrator
* @date:2016年11月2日下午4:28:04 */
public class TestThread  implements Runnable{




private Double amount;
private String password;
private Integer borrowId;
private TestThread thread;
    private Integer userId;


/**
* @return the userId
*/
public Integer getUserId() {
return userId;
}


/**
* @param userId the userId to set
*/
public void setUserId(Integer userId) {
this.userId = userId;
}


private static  Logger logger = Logger.getLogger(TestThread.class);
/**
* @return the amount
*/
public Double getAmount() {
return amount;
}


/**
* @param amount the amount to set
*/
public void setAmount(Double amount) {
this.amount = amount;
}


/**
* @return the password
*/
public String getPassword() {
return password;
}


/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}


/**
* @return the borrowId
*/
public Integer getBorrowId() {
return borrowId;
}


/**
* @param borrowId the borrowId to set
*/
public void setBorrowId(Integer borrowId) {
this.borrowId = borrowId;
}


/**
* @return the thread
*/
public TestThread getThread() {
return thread;
}


/**
* @param thread the thread to set
*/
public void setThread(TestThread thread) {
this.thread = thread;
}






/**
* 建構函式
*/
public TestThread(){
}

public TestThread(TestThread thread){
this.thread =  thread;
}

@Override
public void run() {
String backStr="";
try {
backStr = WebUtils.sendHttp(Config.server_url+"/front/tender/save1", this.getThread());
logger.info(Thread.currentThread().getName()+"-----------is Tender borrow-----------詳細資訊 ");
} catch (Exception e) {
// TODO Auto-generated catch block
logger.info("錯誤訊息:"+e.getMessage());
}
}


}

其中 config 類      WebUtils 類 涉及到 別的同事的 研發     未公開 望海涵!

相關推薦

java模擬併發請求

實現高併發請求,即同一個程序開闢出多個執行緒請求相同的資源 ,再同時對一個資源進行訪問操作。  我們都知道 要實現一個多執行緒的併發服務可以有兩種方式,一種是繼承 Theard  類 ,另一種是實現Runnable 介面  在java.lang.Theard 包中,可以看

模擬併發請求服務端(python gevent)

專案背景:對web後端進行高併發的請求,簡單測試服務框架的效能 解決思路:利用python的多執行緒,但python的多執行緒有點“雞肋”, 個人選擇使用簡潔輕便gevent。 解決方案:採用gevent非同步 + requests 進行高併發請求 import time import

JAVA模擬併發及多執行緒計數器

1、多執行緒高併發模擬實現可採用閉鎖CountDownLatch,設定對應執行緒數的CountDownLatch,達到就緒條件後會多執行緒統一執行。這裡只是單機模擬,因為執行緒採用搶佔式執行方式,並不能完全模擬統一同時執行。 2、多執行緒計數器可採用悲觀鎖CAS實現類Ato

java CountDownLatch 模擬使用者併發請求

java.util.concurrent.CountDownLatch,一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。 主要方法  public CountDownLatch(int count);  public void co

Java如何使用程式碼模擬併發操作(轉摘)

摘要: Java通過程式碼模擬高併發可以以最快的方式發現我們系統中潛在的執行緒安全性問題,此處使用Semaphore(訊號量)和 CountDownLatch(閉鎖)搭配ExecutorService(執行緒池)來進行模擬。Java通過程式碼模擬高併發可以以最快的方式發現我們

Java使用程式碼模擬併發操作

摘要:在java中,使用了synchronized關鍵字和Lock鎖實現了資源的併發訪問控制,在同一時間只允許唯一了執行緒進入臨界區訪問資源(讀鎖除外),這樣子控制的主要目的是為了解決多個執行緒併發同一資源造成的資料不一致的問題。在另外一種場景下,一個資源有多個副本可供同時使

java 利用countdownlatch模擬併發情況

一、簡介 CountDownLatch 是 java.util.concurrent 包下的一個同步輔助類,它能使一個或多個執行緒

PHP模擬併發

PHP模擬高併發 什麼是高併發? 簡單模擬高併發 什麼是高併發? 高併發(High Concurrency)是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。 高併發相關常用的一些

Web大規模併發請求和搶購的原理及解決方案

電商的秒殺和搶購,對我們來說,都不是一個陌生的東西。然而,從技術的角度來說,這對於Web系統是一個巨大的考驗。當一個Web系統,在一秒鐘內收到數以萬計甚至更多請求時,系統的優化和穩定至關重要。這次我們會關注秒殺和搶購的技術實現和優化,同時,從技術層面揭開,為什麼我們總是不容易搶到火車票的原因?&nb

秒殺系統模擬併發

1.初始方案 (1)表設計 商品表設計:熱銷商品提供給使用者秒殺,有初始庫存。 import java.io.Serializable; /** * t_seckillgoods * @author */ public class TSeckillgoods imple

Web大規模併發請求和搶購的解決方案

電商的秒殺和搶購,對我們來說,都不是一個陌生的東西。然而,從技術的角度來說,這對於Web系統是一個巨大的考驗。當一個Web系統,在一秒鐘內收到數以萬計甚至更多請求時,系統的優化和穩定至關重要。這次我們會關注秒殺和搶購的技術實現和優化,同時,從技術層面揭開,為什麼我們總是不容易搶到火車票的原因

springboot2.0+執行緒池+Jmeter以模擬併發

宣告:原創在這裡https://blog.csdn.net/u011677147/article/details/80271174,在此也謝謝哥們。 1、目錄結構   2、BusinessThread.java package com.cn.commodity.config; i

Java處理併發量訪問的處理總結

結合之前做的一個網站,專案中分了幾個子專案,主要用到Redis,service(server)層和control層分離,有做了快取,頁面也是進行靜態化(htm和freemarker),仔細想想,整個專案基本吻合高併發,負載均衡的處理。在網上找了些資料,基本和專案的特點吻合,特別紀念一下,但是後面的一

java處理併發問題的解決發案

      隨著網際網路業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬體到軟體、程式語言、資料庫、WebServer、防火牆等各個領域都有了很高的要求,已經不是原來簡單的html靜態網站所能比

CountDownLatch和CyclicBarrier模擬同時併發請求

  有時候要測試一下某個功能的併發能力,又不要想借助於其他測試工具,索性就自己寫簡單的demo模擬一個併發請求就最方便了。如果熟悉jemter的測試某介面的併發能力其實更專業,此處只是自己折騰著玩。 CountDownLatch和CyclicBarrier是jdk concurrent包下非常有用的兩個併發工

springcloud非同步執行緒池、併發請求feign解決方案

ScenTaskTestApplication.java package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.a

Java 實現併發秒殺

1 需求分析和技術難點: (1) 分析:      秒殺的時候:減少庫存和購買記錄明細兩個事件保持在同一個事物中。      使用聯合查詢避免同一使用者多次秒殺同一商品(利用在插入購物明細表中的秒殺id和使用者的唯一標識來避免)。 (2) 秒殺難點:事務和行級鎖的處理

達達O2O後臺架構演進實踐:從0到4000併發請求背後的努力

1、引言 達達創立於2014年5月,業務覆蓋全國37個城市,擁有130萬註冊眾包配送員,日均配送百萬單,是全國領先的最後三公里物流配送平臺。 達達的業務模式與滴滴以及Uber很相似,以眾包的方式利用社會閒散人力資源,解決O2O最後三公里即時性配送難題(2016年4月,達達已經與京東到家合併

模擬併發的測試(不準確哦)

模擬高併發的原理就是:利用執行緒池去執行多個執行緒通過httpclient訪問controller  package com.xtzn.utils; import com.alibaba.fastjson.JSONObject; import org.apache.http.