Skip to content

Commit 776728c

Browse files
committed
threadLocal study
1 parent b67c6ec commit 776728c

8 files changed

+57
-6
lines changed

src/main/java/io/concurrency/chapter04/exam04/NestedThreadGroupExample.java

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.concurrency.chapter04.exam04;
22

33
public class NestedThreadGroupExample {
4+
45
public static void main(String[] args) throws InterruptedException {
56

67
// 최상위 스레드 그룹 생성
@@ -9,18 +10,27 @@ public static void main(String[] args) throws InterruptedException {
910
// 최상위 스레드 그룹 내부에 하위 스레드 그룹 생성
1011
ThreadGroup subGroup = new ThreadGroup(topGroup, "하위 스레드 그룹");
1112

13+
//하위 스레드 그룹 내부에 최하위 스레드 그룹 생성
14+
ThreadGroup buttomGroup = new ThreadGroup(subGroup, "최하위 스레드 그룹");
15+
1216
// 최상위 스레드 그룹에 속한 스레드 생성
1317
Thread topGroupThread = new Thread(topGroup, new MyRunnable(), "TopGroupThread");
1418

1519
// 하위 스레드 그룹에 속한 스레드 생성
1620
Thread subGroupThread = new Thread(subGroup, new MyRunnable(), "SubGroupThread");
1721

22+
//최하위 스레드 그룹에 속한 스레드 생성
23+
Thread buttomGroupThread = new Thread(buttomGroup, new MyRunnable(), "ButtomGroupThread");
24+
1825
// 그룹 정보 출력
1926
System.out.println(topGroupThread.getName() + " 는 " + topGroupThread.getThreadGroup().getName() + "에 속해 있습니다.");
2027
System.out.println(subGroupThread.getName() + " 는 " + subGroupThread.getThreadGroup().getName() + "에 속해 있습니다.");
28+
System.out.println(buttomGroupThread.getName() + " 는 " + buttomGroupThread.getThreadGroup().getName() + "에 속해 있습니다.");
29+
2130

2231
topGroupThread.start();
2332
subGroupThread.start();
33+
buttomGroupThread.start();
2434

2535
try {
2636
Thread.sleep(1000);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## ThreadGroupScopeExample
2+
3+
- 이미 생성된 스레드의 우선순위를 런타임 중에 변경할 수 없다
4+
- 중첩된 스레드 그룹을 형성했을 때, 모든 스레드는 부모 스레드 그룹의 최대 우선순위 설정을 갖는다
5+
- 부모 스레드 그룹의 최대 우선순위가 4이고 자식 스레드 그룹의 최대 우선순위가 7이라도, 모든 스레드(자식 스레드 그룹의 스레드도 포함)의 최대 우선순위는 4이다
6+
7+
- Q. 중첩 스레드는 실무에서 어떤 경우에 사용하는가?
8+
```text
9+
스레드 안에서 스레드를 사용하는 경우가 흔치는 않지만 서로간 비동기적으로 작업을 처리해야 할 경우 중첩해서 구현하기도 합니다
10+
11+
어떻게 보면 메인스레드 안에서 스레드를 생성하는 것도 중첩스레드라 볼 수 있습니디
12+
13+
한 스레드가 요청을 처리하다가 너무 시간이 오래 걸리는 작업이 있다면 별도의 스레드를 만들어 작업을 위임할 수도 있습니다
14+
15+
상황에 따라 비동기적인 구현이 필요할 때 스레드 안에 또 다른 스레드를 포함할 수 있습니다
16+
```

src/main/java/io/concurrency/chapter04/exam04/ThreadGroupAPIExample.java

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public static void main(String[] args) throws InterruptedException {
55

66
ThreadGroup topGroup = new ThreadGroup("상위그룹");
77

8+
89
// 상위 스레드 그룹에 속하는 스레드들 생성
910
Thread[] topThreads = new Thread[5];
1011
for (int i = 1; i <= 5; i++) {

src/main/java/io/concurrency/chapter04/exam04/ThreadGroupInterruptExample.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public static void main(String[] args) throws InterruptedException {
1212
try {
1313
Thread.sleep(500);
1414
} catch (InterruptedException e) {
15-
e.printStackTrace();
15+
//e.printStackTrace();
16+
System.err.println(topGroup + "스레드 그룹 중단");
1617
return;
1718
}
1819
}
@@ -24,7 +25,8 @@ public static void main(String[] args) throws InterruptedException {
2425
try {
2526
Thread.sleep(500);
2627
} catch (InterruptedException e) {
27-
e.printStackTrace();
28+
//e.printStackTrace();
29+
System.err.println(subGroup + "스레드 그룹 중단");
2830
return;
2931
}
3032
}

src/main/java/io/concurrency/chapter04/exam04/ThreadGroupScopeExample.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public static void main(String[] args) throws InterruptedException {
66
ThreadGroup topGroup = new ThreadGroup("상위그룹");
77
ThreadGroup subGroup = new ThreadGroup(topGroup, "하위그룹");
88

9+
910
// 상위 그룹 스레드에서 하위 그룹의 최대 우선 순위를 변경
1011
Thread topGroupThread = new Thread(topGroup, () -> {
1112
System.out.println("상위 그룹 스레드에서 하위 그룹의 최대 우선 순위 변경 전: " + subGroup.getMaxPriority());
@@ -26,16 +27,20 @@ public static void main(String[] args) throws InterruptedException {
2627
topGroupThread.join();
2728
subGroupThread.join();
2829

29-
// 이미 생성된 스레드는 변경사항이 적용되지 않는다
30+
// 이미 생성된 스레드는 변경사항(우선순위 변경)이 적용되지 않는다
3031
System.out.println(topGroupThread.getName() + ": " + topGroupThread.getPriority());
3132
System.out.println(subGroupThread.getName() + ": " + subGroupThread.getPriority());
3233

34+
//스레드 그룹이 중첩되어서, 부모-자식 관계가 형성되었다면, 부모 그룹의 최대 우선순위 설정 사항이 자식 스레드 그룹에도 적용된다
35+
//즉 부모의 우선순위가 4이고, 자식의 우선순위가 7이라면, 부모 스레드그룹에 속한 모든 스레드(당연히 자식 스레드 그룹 포함)들은 우선순위 4를 가진다
3336
Thread userThread1 = new Thread(topGroup, () -> {}, "유저스레드 1");
3437
Thread userThread2 = new Thread(subGroup, () -> {}, "유저스레드 2");
3538

3639
userThread1.start();
3740
userThread2.start();
3841

42+
43+
3944
userThread1.join();
4045
userThread2.join();
4146

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
## ThreadLocalExample
2+
3+
```java
4+
private static ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Hello World");
5+
```
6+
- 위처럼 초기값을 세팅한후 threadLocal을 계속 사용하다가 threadLocal.remove()를 하게 되면, 초기값만 남겨두고 다 삭제한다. 따라서 이후 get() 하면 초기값이 튀어나옴
7+
8+
9+
## ThreadPoolThreadLocalExample
10+
- 스레드풀은 많은 요청에 대해서 이미 생성된 스레드를 재사용하기 때문에 tl에 저장된 값을 반드시 remove 해줘야 함
11+
-
12+

src/main/java/io/concurrency/chapter04/exam05/ThreadLocalExample.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
public class ThreadLocalExample {
44
// ThreadLocal 변수 생성. 초기값은 null
5-
private static ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Hello World");
6-
// private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
5+
//private static ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Hello World");
6+
private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); //이렇게 하면 아무것도 set하지 않은 상태에서 get() 했을 때 null 나오게 됨
7+
78

89
public static void main(String[] args) {
910

@@ -12,8 +13,12 @@ public static void main(String[] args) {
1213
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
1314
threadLocal.set("스레드 1의 값");
1415
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
16+
threadLocal.remove(); //원래 초기값만 남겨두고 삭제함
17+
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get()); //초기값 튀어나옴
1518
}, "Thread-1");
1619

20+
21+
1722
// 두 번째 스레드: ThreadLocal 값을 설정하고 출력
1823
Thread thread2 = new Thread(() -> {
1924
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());

src/main/java/io/concurrency/chapter04/exam05/ThreadPoolThreadLocalExample.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static void main(String[] args) {
1515
threadLocal.set("작업 1의 값");
1616
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
1717
// 작업 종료 후 값을 지워야 함
18-
// threadLocal.remove();
18+
threadLocal.remove();
1919
});
2020

2121
// 잠시 대기

0 commit comments

Comments
 (0)