๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/JAVA

[JAVA] ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• - Thread

by ynzu๐Ÿค 2022. 4. 27.
๋ฐ˜์‘ํ˜•

 

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๋ฌธ์ด ๋„๋Š” ๊ฒƒ!

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€