JAVA์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ค๋ฅธ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
public void request() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//์ฝ๋ ์์ฑ
}
});
thread.start();
}
ํ์ง๋ง ๋ณ๋ ฌ์์
์ฒ๋ฆฌ๋์ด ๋ง์์ง๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๋๋ฐ, ์ด๋ฅผ ๋ง๊ธฐ ์ํด์ ์ค๋ ๋ ํ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ค๋ ๋ํ์ ์ค๋ ๋ ๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ์ ํด ๋๊ณ , ์์
ํ์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ์ค๋ ๋๋ค์๊ฒ ํ ๋นํ๋ ๋ฐฉ์์ด๋ค.
JDK 1.5๋ถํฐ๋ java.util.concurrent Package์ ExecutorService ์ธํฐํ์ด์ค์ Executors ํด๋์ค๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
static ExecutorService executorService = Executors.newFixedThreadPool(10);
public void request() {
executorService.submit(new Runnable() {
@Override
public void run() {
//์ฝ๋ ์์ฑ
}
});
}
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ ๋ ํ์ ์ ์ฉํ์ง๋ง ์ค๋ ๋ ํ๋ ๋จ์ ์ด ์๋ค.
100๊ฐ์ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด ๋์์ง๋ง ์ค์ ๋ก 10๊ฐ์ ์์ฒญ๋ง ๋ค์ด์จ๋ค๋ฉด ๋๋จธ์ง 90๊ฐ์ ์ค๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฐจ์งํ๊ฒ ๋๊ณ .. ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค.
๋ํ ์์
์๋ฃ ์์ ์๊ฐ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ์ ํด ์๊ฐ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด A, B, C, D ์ค๋ ๋๊ฐ ์์ ๊ฒฝ์ฐ A, B๋ ์ด๋ฏธ ์ฒ๋ฆฌ๊ฐ ๋๋ฌ๋๋ฐ C, D๋ ์๋ฃ๋์ง ์์์ ๊ฒฝ์ฐ A, B ์ค๋ ๋๋ C, D์ ์์
์ด ๋๋ ๋๊น์ง ๊ฐ๋ค๋ฆฌ๊ฒ๊ฒ ๋๋ค.
์ด๋ฅผ ๋ฐฉ์ง ํ๊ธฐ ์ํด JDK 1.7๋ถํฐ๋ forJoinPool๋ฅผ ์ ๊ณตํ๋ฉฐ, ์๋ ๋ธ๋ก๊ทธ์์ ์์ธํ ์ค๋ช
์ ๋ณผ ์ ์๋ค! (์ค๋ช
์ ์ฝ๊ฒ ์ ํด๋จ์ผ๋ฏ๋ก ๊ผญ ๋ณด๊ธฐ!) https://hamait.tistory.com/612
๋ณธ์ธ์ ๋๋์ ์์ฒญ์ ๋ณ๋ ฌ์ฒ๋ฆฌํ ๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- RequestService.java
RequestThread requestThread = null;
ArrayList threadList = new ArrayList();
int reqThreadCnt = 3;
for(int i = 0 ; i < reqList.size() ; i++) {
reqVo = reqList.get(i);
requestThread = new RequestThread(this, reqVo);
requestThread.start(); //Thread ์คํ, RequestThread์ run ๋ฉ์๋๊ฐ ์คํ๋จ.
threadList.add(requestThread);
//์ด ๋ถ๋ถ ์์๋ ์๋ ์ฐธ๊ณ ํ๊ธฐ!
if( ( ( i + 1) % this.reqThreadCnt == 0 ) || ( i == (reqList.size() - 1 ) ) ){
super.checkThreadListAlive(threadList, 3000);
threadList.clear();
}
}
- reqList = ์์ฒญ์ ๋ณด๋ผ ๋ฐ์ดํฐ ๋ฆฌ์คํธ
- reqThreadCnt = ํ๋ฒ์ ์คํ๋๋ ์ค๋ ๋ ๊ฐ์
- RequestThread= ์ค๋ ๋
- ์์
- ๋ฐ์ดํฐ๊ฐ 1~10๊น์ง 10๊ฐ๊ฐ ์๊ณ , ์ค๋ ๋ ๊ฐ์๊ฐ 3๊ฐ๋ผ๋ฉด ๋จผ์ 1,2,3 ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- 1,2,3 ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ๋๋ฉด 4,5,6 ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- 4,5,6 ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ๋๋ฉด 7,8,9 ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- 7,8,9 ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ๋๋ฉด 10 ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ((i + 1) % reqThreadCnt) == 0
- 3(i=2), 6(i=5),9(i=8)๋ฐ์ดํฐ ์ฒ๋ฆฌํ ๋ ์ ์กฐ๊ฑด์ด ture → checkThreadListAlive ์คํ
- i == (reqList.size() - 1 ): 10 ๋ฐ์ดํฐ ์ฒ๋ฆฌํ ๋ ์ ์กฐ๊ฑด์ด true
- ๋ง์ง๋ง ๋ฐ์ดํฐ์ธ์ง ์ฒดํฌํด์ ์ค๋ ๋ ๊ฐ์๋งํผ ์ํ์ด๋ checkThreadListAlive ์คํ๋๊ฒ ํ๊ธฐ ์ํ ์กฐ๊ฑด
- 3(i=2), 6(i=5),9(i=8)๋ฐ์ดํฐ ์ฒ๋ฆฌํ ๋ ์ ์กฐ๊ฑด์ด ture → checkThreadListAlive ์คํ
- RequestThread.java
/**
* ํ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ Thread
*/
public class RequestThread extends Thread{
public Logger logger = Logger.getLogger(RequestThread.class.getName());
private RequestService requestService;
private TestVo req ;
public RequestThread(RequestService requestService, TestVo req) {
this.requestService = requestService;
this.req = req;
}
@Override
public void run() {
this.requestService.request(this.req);
}
}
- checkThreadAlive ๋ฉ์๋
/**
* Thread๊ฐ ์ด์์๋์ง check
* @param threadList
* @param sleepMIS
*/
public void checkThreadAlive(ArrayList threadList, int sleepMIS) {
boolean isAlive = true;
while(isAlive) {
try {
Thread.sleep(sleepMIS);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread thread = null;
for(int i = 0 ; i < threadList.size(); i++) {
thread = (Thread)threadList.get(i);
if(thread != null && thread.isAlive()) {
isAlive = true;
break;
}
thread = null;
isAlive = false;
}
}
}
- sleepMIS : 3000 → 3์ด๋ง๋ค ์ค๋ ๋๊ฐ ์ด์์๋์ง ์ฒดํฌ
=> ์ค๋ ๋๊ฐ ์ฃฝ์๋ค๋๊ฑด ํ๋ก์ธ์ค ์๋ฃ ํ๋ค๋ ๊ฒ!
- 1,2,3 ์ฒ๋ฆฌํ๋ ์ค๋ ๋ 3๊ฐ๊ฐ threadList์ ๋ด๊ฒจ์์
=> for๋ฌธ ๋๋ฉด์ ์ค๋ ๋ 3๊ฐ๊ฐ ๋ค ์ข ๋ฃํ ๋๊น์ง while๋ฌธ์ด ๋๋ ๊ฒ!
๋๊ธ