本文為作者原創,禁止轉載,違者必究法律責任!!!
本文為作者原創,禁止轉載,違者必究法律責任!!!
Java接口多線程並發測試
一,首先寫一個接口post 請求代碼:
import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.StatusLine; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class postRequest { public static void postRequestTest(String para1, String para2, String para3 ) throws Exception { long begaintime = System.currentTimeMillis();//開始系統時間 CloseableHttpClient httpclient = HttpClients.createDefault(); String url = "https://www.baidu.com"; HttpPost httpPost = new HttpPost(url);// 創建httpPost httpPost.setHeader("Authorization", "Bearer qwertyu12345678zxcvbnm"); httpPost.setHeader("Content-Type", "application/json"); httpPost.setHeader("time", "11234567890"); httpPost.setHeader("X-Accept-Locale", "zh_CN"); //添加 body 參數 String orderToken = postRequest1(para1); //從上一個接口的返回數據里面獲取參數 String body = String.format("{\"Name\":\"%s\",\"age\":\"%s\",\"address\":\"%s\"}", para2, para3,orderToken); httpPost.setEntity(new StringEntity(body)); //設置 params 參數-------------設置了body就不能再設置params //String params = ""; //String charSet = "UTF-8"; //StringEntity entity = new StringEntity(params, charSet); //httpPost.setEntity(entity); CloseableHttpResponse response = null; try { response = httpclient.execute(httpPost); StatusLine status = response.getStatusLine(); int state = status.getStatusCode(); if (state == HttpStatus.SC_OK) { HttpEntity responseEntity = response.getEntity(); String jsonString = EntityUtils.toString(responseEntity); System.out.println("TakegoOrder 接口請求成功"); //return jsonString; System.out.println(jsonString); if(jsonString.contains("\"success\":true")&&jsonString.contains("\"time\":\"2018")){ System.out.println("成功查詢!!!!"); }else { System.err.println("查詢失敗!!----"+body); } } else{ System.err.println("請求返回:"+state+"("+url+")"); } } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); //結束時間 System.out.println(" 接口請求耗時 : "+(endTime-begaintime)); } //return null; }
二,再寫一個 MyThread 類 繼承Runnable 接口
import java.util.concurrent.CountDownLatch; public class MyThread implements Runnable { private String para1; private String para2; private String para3; private CountDownLatch countDownLatch; //多線程結束后,執行后面的代碼(計算時間、數量) public MyThread(String para1, String para2, String para3, CountDownLatch countDownLatch) { this.para1 = para1; this.para2 = para2; this.para3 = para3; this.countDownLatch = countDownLatch; } public void run() { try{ postRequest.postRequestTest(para1, para2, para3); }catch(Exception e){ e.printStackTrace(); }finally { countDownLatch.countDown(); } } }
三,寫一個test 類的main方法來執行多線程並發
public class Test { public static void main(String[] args) throws InterruptedException { long begaintime = System.currentTimeMillis();//開始系統時間 //線程池 ExecutorService pool = Executors.newCachedThreadPool(); //設置集合點為93 final int count = 50; CountDownLatch countDownLatch = new CountDownLatch(count);//與countDownLatch.await();實現運行完所有線程之后才執行后面的操作 //final CyclicBarrier barrier = new CyclicBarrier(count); //與barrier.await() 實現並發; //創建100個線程 for(int i = 0; i < count; i++){ MyThread target = new MyThread("para1", "para2", "para3", countDownLatch); //barrier.await(); pool.execute(target); } pool.shutdown(); try { countDownLatch.await(); //這一步是為了將全部線程任務執行完以后,開始執行后面的任務(計算時間,數量) } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); //結束時間 System.out.println(count + " 個 接口請求總耗時 : "+(endTime-begaintime)+"-----平均耗時為"+ ((endTime-begaintime)/count)); } }
本文為作者原創,禁止轉載,違者必究法律責任!!!
本文為作者原創,禁止轉載,違者必究法律責任!!!