1. 程式人生 > >java多線程高並發

java多線程高並發

。。 his begin post imp 並發 blog 請求 asd

旭日Follow_24 的CSDN 博客 ,全文地址請點擊:

https://blog.csdn.net/xuri24/article/details/81293321

“高並發和多線程”總是被一起提起,給人感覺兩者好像相等,實則 高並發 ≠ 多線程

  多線程是完成任務的一種方法,高並發是系統運行的一種狀態,通過多線程有助於系統承受高並發狀態的實現

一,高並發與多線程

1,高並發:高並發不是JAVA的專有的東西,是語言無關的廣義的,為提供更好互聯網服務而提出的概念。高並發想讓服務器(tomcat)能接受處理多用戶多請求。

2,多線程:多線程只是為了達到高並發目的(首先得有多線程接收處理多任務,才有高並發發生)。在某個細節點上,為實現某並發功能而采用的一種具體的實現方法,這種功能也可以由多進程實現,

當然,也可以由多進程,多線程一起實現。這是戰術上的並行。

總之:高並發是一種現象,多線程是一種Java提高性能的手段

其實就是用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();
}


}
}
}

java多線程高並發