java代码模拟高并发,多线程之CountDownLatch,Semaphore

标题通过c可以模拟高并发,多线程

需要测试的高并发或多线程的业务代码
package test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 主业务类
 *
 */
public class Common {

	private int count = 0;
	private AtomicInteger atomicInteger = new AtomicInteger(0);
	public void add() {
		count++;
	}
	public void addAtomicInteger() {
		atomicInteger.addAndGet(1);
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public AtomicInteger getAtomicInteger() {
		return atomicInteger;
	}
	public void setAtomicInteger(AtomicInteger atomicInteger) {
		this.atomicInteger = atomicInteger;
	}	
	
	
}
通过过CountDownLatch,Semaphore来测试该业务代码
package test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 测试多线程高并发
 * 
 * @author hWX393213
 *
 */
public class ConcurrencyTest {

	// 请求总数
	public static int clientTotal = 5000;

	// 同时并发的线程数
	public static int threadTotal = 200;

	public static void main(String[] args) {
		// 创建线程池
		ExecutorService executorService = Executors.newCachedThreadPool();
		// 定义信号量
		final Semaphore semaphore = new Semaphore(threadTotal);
		//定义计数器闭锁
		final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);

		//需要测试的业务主类
		Common common = new Common();
		for (int i = 0; i < clientTotal; i++) {
			//将需要测试的业务全部放入线程池
			executorService.execute(() -> {
				try {
					//当线程允许被执行时才执行
					semaphore.acquire();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//需要测试的主业务的具体方法
				common.add();//测试int是否线程安全
				common.addAtomicInteger();//测试AtomicInteger是否线程安全
				
				//线程执行完后释放
				semaphore.release();
				//每次线程执行完之后,countdown一次
				countDownLatch.countDown();
			});

		}
		try {
			//该方法可以保证clientTotal减为0.既可以保证所有的线程都执行完毕了
			countDownLatch.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//所有的线程执行完了后,关闭线程池
		executorService.shutdown();
		System.out.println("count=" + common.getCount() + "~AtomicInteger=" + common.getAtomicInteger());
	}
}
CountDownLatch说明

CountDownLatch是一种java.util.concurrent包下一个同步工具类,从字面的意思理解,用在多线程中就是一个倒计时器,当倒计时数到0时,就是表示多线程所有的完成,核心代码countDownLatch.countDown()和countDownLatch.await();
countDownLatch.await()该方法可以保证clientTotal减为0.既可以保证所有的线程都执行完毕了

Semaphore说明

Semaphore 信号量,核心代码semaphore.acquire()和semaphore.release();
semaphore.acquire()判断进程是否满足执行条件,若满足才继续下一步
semaphore.release()释放进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值