“高并發(fā)和多線程”總是被一起提起济炎,給人感覺兩者好像相等,實則高并發(fā) ≠ 多線程
多線程是完成任務(wù)的一種方法吻谋,高并發(fā)是系統(tǒng)運行的一種狀態(tài)逝变,通過多線程有助于系統(tǒng)承受高并發(fā)狀態(tài)的實現(xiàn)
1,高并發(fā):高并發(fā)不是JAVA的專有的東西,是語言無關(guān)的廣義的膛堤,為提供更好互聯(lián)網(wǎng)服務(wù)而提出的概念手趣。高并發(fā)想讓服務(wù)器(tomcat)能接受處理多用戶多請求。
2,多線程:多線程只是為了達到高并發(fā)目的(首先得有多線程接收處理多任務(wù)骑祟,才有高并發(fā)發(fā)生)回懦。在某個細節(jié)點上,為實現(xiàn)某并發(fā)功能而采用的一種具體的實現(xiàn)方法次企,這種功能也可以由多進程實現(xiàn)怯晕,
當然,也可以由多進程缸棵,多線程一起實現(xiàn)舟茶。這是戰(zhàn)術(shù)上的并行。
總之:高并發(fā)是一種現(xiàn)象,多線程是一種Java提高性能的手段
其實就是用CountDownLatch來使多個線程同時運行,同時發(fā)送請求吧凉,雖然post的事件不能保證同時隧出,但發(fā)post能保證同時(相差0.2毫秒),通過這種方法阀捅,測試了redis的setkey胀瞪,getkey來保證不重復(fù)數(shù)據(jù)的時間閾值在幾百納秒,再短就算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 header = new HashMap<>();
header.put("Content-Type", "application/json");
header.put("sign", sign);
ScoreRequestBean bean = new ScoreRequestBean();
Data data = new Data();
data.setRemark("單發(fā)測試");
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() +
"命令已結(jié)束");
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
end.countDown();
}
}
}
}
------------------------------------------------------------------------------------------------------------------------------
本文來自 旭日Follow_24 的CSDN 博客 ,全文地址請點擊:https://mp.csdn.net/postedit/81293321