"๋ณ๋ ฌ ์คํธ๋ฆผ" ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋ ฌํํ์ฌ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
๋ณ๋ ฌ ์คํธ๋ฆผ์ ์คํธ๋ฆผ API์ ํ ์ข ๋ฅ๋ก,๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด๋ค.
์ฆ, ์คํธ๋ฆผ์ ์์๋ค์ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋ค์ค์ฝ์ด(CPU ์ฝ์ด) ์์คํ ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์๋ค. ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํ๋ฉฐ, ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ๋จ์ผ ์ค๋ ๋ ์ฒ๋ฆฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ณ๋ ฌ ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก Fork/Join ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํ๋ค.
Fork/Join ํ๋ ์์ํฌ๋ ์์ ์ ์์ ์์ ๋ค๋ก ๋ถํ ํ๊ณ , ์ด๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ํ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์์ ์ ๋ ์์ ์์ ๋จ์๋ก ๋๋์ด ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
๋ณ๋ ฌ ์คํธ๋ฆผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ธฐ์กด์ ์คํธ๋ฆผ์ ๋ณ๋ ฌ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๊ธฐ ์ํด parallel() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์คํธ๋ฆผ์ ์ฒ๋ฆฌ๊ฐ ๋ณ๋ ฌ๋ก ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค.
๋ํ ๋ฐ๋๋ก ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๋๋ ํ์ sequential() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
List<String> myList = Arrays.asList("apple", "banana", "orange", "grape", "strawberry");
//๋ณ๋ ฌ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ์์๋ฅผ ๋๋ฌธ์๋ก ์ถ๋ ฅํ๋ค.
myList.parallelStream().map(String::toUpperCase).forEach(System.out::println);
ParallelStream
Java 8์์ ๋ฑ์ฅํ Stream ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
์ด์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ค๋ ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ด๋ฆฌํ ํ์๊ฐ ์์ด parallel(), parallelStream() ๋ฉ์๋๋ฅผ ํธ์ถํจ์ ํตํด ์์์ ForkJoinFramework ๊ด๋ฆฌ ๋ฐฉ์์ ์ด์ฉํด ์์ ์ ๋ถํ ํ๊ณ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ค.
Fork / Join Framework
๊ทธ๋ ๋ค๋ฉด Fork / Join Framework๋ ๋ฌด์์ผ๊น?
์ด๋ ๋ค์ํ ์์
๋ค์ ๋ถํ ๊ฐ๋ฅํ ๋งํผ ์ชผ๊ฐ๊ณ , ์ด ์ชผ๊ฐ์ง ์์
๋ค์ Work Thread๋ฅผ ํตํด ์์
ํ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ณผ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ ๋ค.
์ฆ, ๋ถํ ์ ๋ณต (Divide and Conquer) ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํ ์์ ์ด๋ฉฐ, Fork ๋ฅผ ํตํด Task๋ฅผ ๋ถ๋ดํ๊ณ Join์ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๊ณผ์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
Fork / Join Framework์ Work Thread์ ์๋ ํด๋น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ๋๋๋ ์๋ฒ์ ์คํ์ ๋ฐ๋ผ ๋ฐ๋๋ค.
Runtime.getRuntime().availableProcessors()์ผ๋ก JVM์์ ์ด์ฉ ๊ฐ๋ฅํ CPU Core ๊ฐ์๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ,
์ค๋ ๋๊ฐ N๊ฐ ์์ฑ๋์์ ๋, ํ๋๋ ๋ฉ์ธ ์ค๋ ๋๋ก ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ ์ค๋ ๋์ ๋๋จธ์ง N-1๊ฐ์ ์ค๋ ๋๋ฅผ ForkJoinPool ์ค๋ ๋๋ผ๊ณ ํ๋ค.
๊ธฐ๋ณธ ์คํธ๋ฆผ vs ๋ณ๋ ฌ ์คํธ๋ฆผ ์์
์คํธ๋ฆผ ์์ )
public static void main(String[] args) {
List<Integer>numbers = Arrays.asList(1,2,3,4); //Integerํ์
์ ๋ฆฌ์คํธ ์์ฑ
long start = System.currentTimeMillis(); //ํ์ฌ ์๊ฐ ๊ธฐ๋ก
//numbers ๋ฆฌ์คํธ์ ๊ฐ ์์์ ๋ํด ์์
์ ์ํํ๋ค.
numbers.forEach(number -> {
try {
Thread.sleep(3000); //ํ์ฌ ์ค๋ ๋ 3์ด ์ผ์ ์ค์ง
System.out.println(number + ": " + Thread.currentThread().getName());
} catch (InterruptedException e) {}
});
//์์
์ด ์๋ฃ๋ ํ์ ์๊ฐ ๊ณ์ฐ
long duration = (System.currentTimeMillis() - start);
//๋ฐ๋ฆฌ์ด๋ ์ด๋ก ๋ณํํ๋ค.
double seconds = duration / 1000.0;
System.out.printf("Done in %.2f sec\n", seconds);
}
//์ฝ๋ ์คํ ๊ฒฐ๊ณผ
1: main
2: main
3: main
4: main
Done in 12.05 sec
๋ณ๋ ฌ ์คํธ๋ฆผ ์์ )
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
long start = System.currentTimeMillis();
numbers.parallelStream().forEach(number -> {
try {
Thread.sleep(3000);
System.out.println(number + ": " + Thread.currentThread().getName());
} catch (InterruptedException e) {}
});
long duration = (System.currentTimeMillis() - start);
double seconds = duration / 1000.0;
System.out.printf("Done in %.2f sec\n", seconds);
}
//์ฝ๋ ์คํ ๊ฒฐ๊ณผ
3: main
1: ForkJoinPool.commonPool-worker-2
2: ForkJoinPool.commonPool-worker-1
4: ForkJoinPool.commonPool-worker-3
Done in 3.04 sec
๋ณ๋ ฌ ์คํธ๋ฆผ ์ฌ์ฉ ์ ์ฃผ์ํ ์
1. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ถฉ๋ถํ ํฌ๊ณ , ์ฐ์ฐ๋์ด ๋ง์ ๋์๋ง ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
2. ์คํธ๋ฆผ์ ์์๊ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์์ ํด์ผ ํ๋ค.
ex. ์คํธ๋ฆผ์ ์ฐ์ฐ์ด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ(๋ฉค๋ฒ ๋ณ์๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ) ๋ฑ์ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
3. ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ฌ์ฉํ ๋๋ ์ฑ๋ฅ ํ ์คํธ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ค์ ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ฑ๋ฅ์ ํฅ์์ํค๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ์คํธ๋ฆผ์ ํฌ๊ธฐ์ ์์ ์ ๋ณต์ก์ฑ์ ๋ง๊ฒ ์กฐ์ ํด์ผ ํ๋ค.
'๐ฉ๐ปโ๐ป Developer > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ฐ์ฒด์งํฅ ์ค๊ณ 5์์น SOLID 1. ๋จ์ผ์ฑ ์์์น (SRP) (0) | 2025.01.22 |
---|---|
[Java] hashCode()์ equals()๋? (0) | 2024.03.31 |
[Java] '๊น์ ๋ณต์ฌ'์ '์์ ๋ณต์ฌ'๋? (0) | 2024.03.30 |
[Java] Java8, Java11, Java17์ ์ฐจ์ด ๋ฐ ๊ธฐ๋ฅ (0) | 2024.03.22 |
๋๊ธ