其实就是用CountDownLatch来使多个线程同时运行,同时发送请求,虽然post的事件不能保证同时,但发post能保证同时(相差0.2毫秒),通过这种方法,测试了redis的setkey,getkey来保证不重复数据的时间阈值在几百纳秒,再短就算redis也无能为力了,所以多线程虽然快,但是没锁,还是不太安全。。

@Service

public class TestConcurrentService {


@Autowired
private ApiHttpClientService apiHttpClientService;


private static final Logger logger = Logger.getLogger(TestConcurrentService.class);


public void testConcurrent1(String sign) {


ExecutorService exec = Executors.newFixedThreadPool(3);
CountDownLatch begin = new CountDownLatch(1);
CountDownLatch end = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
exec.execute(new HttpRequestUtils(begin, end, sign));


}
begin.countDown();


try {
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
exec.shutdown();
logger.info("main method end");
}


public class HttpRequestUtils implements Runnable {
private Logger log = Logger.getLogger(HttpRequestUtils.class);


private CountDownLatch begin;
private CountDownLatch end;


private String sign;


private String url = "http://localhost:8080/score/private/v1/injectsg";


public HttpRequestUtils(CountDownLatch begin, CountDownLatch end, String sign) {
this.begin = begin;
this.end = end;
this.sign = sign;


}


@Override
public void run() {
try {
begin.await();
Map<String, String> header = new HashMap<>();
header.put("Content-Type", "application/json");
header.put("sign", sign);


ScoreRequestBean bean = new ScoreRequestBean();
Data data = new Data();
data.setRemark("单发测试");
data.setExtId("ext111111519");
data.setPartnerMemberId(297);
data.setPoints(1);
bean.setData(data);
bean.setEventId("123asdasd");
System.out.println("线程" + Thread.currentThread().getName() +
"已接受命令," + "时间为:" + System.nanoTime() + "|" + System.nanoTime() / 1000000L);


apiHttpClientService.post(url, null, header, bean, ResultConstant.class);
System.out.println("线程" + Thread.currentThread().getName() +
"命令已结束");
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
end.countDown();
}


}
}




}

更多相关文章

  1. 接口之命令模式
  2. Java错误:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsE
  3. Java并发面试题:三个线程轮流打印十次abc
  4. 【java】线程安全的整型类AtomicInteger
  5. Java多线程编程
  6. 线程“main”中的异常java.lang.RuntimeException:无法编译的源代
  7. Java ThreadPoolExecutor 线程池调度器
  8. Java多线程wait和notify协作,按序打印abc
  9. Java多线程系列八——volatile和ThreadLocal

随机推荐

  1. Android Telephony Framework相关知识整
  2. Android桌面应用
  3. Android根据输入银行卡号判断属于哪个银
  4. Vectors时代(2) - 图像的路径动画
  5. 命令行建avd
  6. RelativeLayout用到的一些重要的属性(自
  7. Android build.gradle文件详解(转述自《An
  8. 从Android浏览器(并不是Appliaction里面
  9. Android 10ms问题:关于Android音频路径延
  10. Android配置QQ邮箱问题