java CountDownLatch 模擬使用者併發請求
阿新 • • 發佈:2019-02-01
java.util.concurrent.CountDownLatch,一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
構造方法引數指定了計數的次數
countDown方法,當前執行緒呼叫此方法,則計數減一
awaint方法,呼叫此方法會一直阻塞當前執行緒,直到計時器的值為0
示例程式碼:模擬多使用者請求
package com.settlement.concurrent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; import com.settlement.commons.utils.HttpRequest; /** * 模擬使用者的併發請求,檢測使用者樂觀鎖的效能問題 * * @author zzg * @date 2017-02-10 */ public class ConcurrentTest { final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args){ CountDownLatch latch=new CountDownLatch(1);//模擬5人併發請求,使用者錢包 for(int i=0;i<5;i++){//模擬5個使用者 AnalogUser analogUser = new AnalogUser("user"+i,"58899dcd-46b0-4b16-82df-bdfd0d953bfb","1","20.024",latch); analogUser.start(); } latch.countDown();//計數器減一 所有執行緒釋放 併發訪問。 System.out.println("所有模擬請求結束 at "+sdf.format(new Date())); } static class AnalogUser extends Thread{ String workerName;//模擬使用者姓名 String openId; String openType; String amount; CountDownLatch latch; public AnalogUser(String workerName, String openId, String openType, String amount, CountDownLatch latch) { super(); this.workerName = workerName; this.openId = openId; this.openType = openType; this.amount = amount; this.latch = latch; } @Override public void run() { // TODO Auto-generated method stub try { latch.await(); //一直阻塞當前執行緒,直到計時器的值為0 } catch (InterruptedException e) { e.printStackTrace(); } post();//傳送post 請求 } public void post(){ String result = ""; System.out.println("模擬使用者: "+workerName+" 開始傳送模擬請求 at "+sdf.format(new Date())); result = HttpRequest.sendPost("http://localhost:8080/Settlement/wallet/walleroptimisticlock.action", "openId="+openId+"&openType="+openType+"&amount="+amount); System.out.println("操作結果:"+result); System.out.println("模擬使用者: "+workerName+" 模擬請求結束 at "+sdf.format(new Date())); } } }