“高并發(fā)和多線程”總是被一起提起,給人感覺兩者好像相等,實(shí)則高并發(fā) ≠ 多線程
多線程是完成任務(wù)的一種方法,高并發(fā)是系統(tǒng)運(yùn)行的一種狀態(tài),通過多線程有助于系統(tǒng)承受高并發(fā)狀態(tài)的實(shí)現(xiàn)
1,高并發(fā):高并發(fā)不是JAVA的專有的東西,是語(yǔ)言無關(guān)的廣義的,為提供更好互聯(lián)網(wǎng)服務(wù)而提出的概念。高并發(fā)想讓服務(wù)器(tomcat)能接受處理多用戶多請(qǐng)求。
2,多線程:多線程只是為了達(dá)到高并發(fā)目的(首先得有多線程接收處理多任務(wù),才有高并發(fā)發(fā)生)。在某個(gè)細(xì)節(jié)點(diǎn)上,為實(shí)現(xiàn)某并發(fā)功能而采用的一種具體的實(shí)現(xiàn)方法,這種功能也可以由多進(jìn)程實(shí)現(xiàn),
當(dāng)然,也可以由多進(jìn)程,多線程一起實(shí)現(xiàn)。這是戰(zhàn)術(shù)上的并行。
總之:高并發(fā)是一種現(xiàn)象,多線程是一種Java提高性能的手段
其實(shí)就是用CountDownLatch來使多個(gè)線程同時(shí)運(yùn)行,同時(shí)發(fā)送請(qǐng)求,雖然post的事件不能保證同時(shí),但發(fā)post能保證同時(shí)(相差0.2毫秒),通過這種方法,測(cè)試了redis的setkey,getkey來保證不重復(fù)數(shù)據(jù)的時(shí)間閾值在幾百納秒,再短就算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ā)測(cè)試");
data.setExtId("ext111111519");
data.setPartnerMemberId(297);
data.setPoints(1);
bean.setData(data);
bean.setEventId("123asdasd");
System.out.println("線程" + Thread.currentThread().getName() +
"已接受命令," + "時(shí)間為:" + 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 博客 ,全文地址請(qǐng)點(diǎn)擊:https://mp.csdn.net/postedit/81293321