1. 程式人生 > >java CountDownLatch 模擬使用者併發請求

java CountDownLatch 模擬使用者併發請求

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())); 
			
		}
		
		
		
		
		
	}

}