add user agent parser and update build configuration

This commit is contained in:
2025-03-11 11:32:36 +09:00
parent 3db3499d30
commit 09731f464d
47 changed files with 8825 additions and 18 deletions

View File

@@ -0,0 +1,199 @@
자바의 `Thread` 클래스와 관련된 주요 메서드들을 표로 정리하고, 각 메서드에 대한 설명과 예시를 포함한 글을 작성하겠습니다. 아래는 요청하신 내용입니다.
---
### 자바 Thread 관련 메서드 표
| 메서드명 | 반환 타입 | 설명 |
|-------------------------|-----------|--------------------------------------------------------------------------------------|
| `start()` | `void` | 스레드를 시작하며, `run()` 메서드를 호출하여 실행 준비 상태로 만듦 |
| `run()` | `void` | 스레드가 실행할 작업을 정의 (직접 호출 시 스레드 생성 없이 현재 스레드에서 실행) |
| `sleep(long millis)` | `void` | 지정된 시간(밀리초) 동안 스레드를 일시 정지 (정적 메서드) |
| `join()` | `void` | 해당 스레드가 종료될 때까지 현재 스레드가 기다림 |
| `interrupt()` | `void` | 스레드에 인터럽트를 발생시켜 작업을 중단 요청 |
| `isAlive()` | `boolean` | 스레드가 실행 중인지 여부를 확인 |
| `setPriority(int n)` | `void` | 스레드의 우선순위를 설정 (1~10 사이 값) |
| `getPriority()` | `int` | 스레드의 현재 우선순위를 반환 |
| `yield()` | `void` | 현재 스레드가 다른 스레드에게 실행 기회를 양보 (정적 메서드) |
| `currentThread()` | `Thread` | 현재 실행 중인 스레드 객체를 반환 (정적 메서드) |
---
### Thread 메서드 설명 및 예시
자바에서 스레드는 멀티태스킹을 구현하는 데 필수적인 요소입니다. `Thread` 클래스와 `Runnable` 인터페이스를 통해 스레드를 생성하고 관리할 수 있으며, 위 표에 정리된 메서드들은 스레드의 생명주기와 동작을 제어하는 데 사용됩니다. 아래에서는 주요 메서드들을 예시와 함께 설명하겠습니다.
#### 1. `start()`와 `run()`
- **`start()`**: 새로운 스레드를 생성하고 실행 가능한 상태로 만들어 `run()` 메서드를 호출합니다.
- **`run()`**: 실제 스레드가 수행할 작업을 정의합니다. 단, `run()`을 직접 호출하면 새로운 스레드가 생성되지 않고 현재 스레드에서 실행됩니다.
```java
class MyThread extends Thread {
public void run() {
System.out.println("스레드 실행 중: " + Thread.currentThread().getName());
}
}
public class ThreadExample {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 새로운 스레드 생성 및 실행
// thread.run(); // 이렇게 호출하면 메인 스레드에서 실행됨
}
}
```
- 출력: `스레드 실행 중: Thread-0`
#### 2. `sleep(long millis)`
- 지정된 시간 동안 현재 스레드를 일시 정지합니다. 다른 스레드에게 CPU를 양보하며, `InterruptedException`을 처리해야 합니다.
```java
public class SleepExample {
public static void main(String[] args) {
try {
System.out.println("2초 후에 깨어납니다.");
Thread.sleep(2000); // 2초 대기
System.out.println("깨어났습니다!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
- 출력:
```
2초 후에 깨어납니다.
(2초 대기 후)
깨어났습니다!
```
#### 3. `join()`
- 다른 스레드가 종료될 때까지 현재 스레드가 기다리도록 합니다. 작업 순서를 보장할 때 유용합니다.
```java
class WorkerThread extends Thread {
public void run() {
System.out.println("작업 시작");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("작업 완료");
}
}
public class JoinExample {
public static void main(String[] args) throws InterruptedException {
WorkerThread worker = new WorkerThread();
worker.start();
worker.join(); // worker 스레드가 끝날 때까지 대기
System.out.println("메인 스레드 계속 진행");
}
}
```
- 출력:
```
작업 시작
(1초 후)
작업 완료
메인 스레드 계속 진행
```
#### 4. `interrupt()`
- 스레드에 인터럽트를 발생시켜 작업을 중단하도록 요청합니다. `sleep()`이나 `wait()` 중인 스레드는 `InterruptedException`을 발생시킵니다.
```java
class InterruptThread extends Thread {
public void run() {
try {
while (true) {
System.out.println("작업 중...");
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("인터럽트 발생! 종료합니다.");
}
}
}
public class InterruptExample {
public static void main(String[] args) throws InterruptedException {
InterruptThread thread = new InterruptThread();
thread.start();
Thread.sleep(2000); // 2초 후 인터럽트
thread.interrupt();
}
}
```
- 출력:
```
작업 중...
작업 중...
작업 중...
인터럽트 발생! 종료합니다.
```
#### 5. `setPriority(int n)`와 `getPriority()`
- 스레드의 우선순위를 설정하고 확인합니다. 우선순위는 1(최저)에서 10(최고)까지이며, 기본값은 5입니다.
```java
public class PriorityExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> System.out.println("Thread 1 실행"));
Thread thread2 = new Thread(() -> System.out.println("Thread 2 실행"));
thread1.setPriority(Thread.MIN_PRIORITY); // 1
thread2.setPriority(Thread.MAX_PRIORITY); // 10
System.out.println("Thread 1 우선순위: " + thread1.getPriority());
System.out.println("Thread 2 우선순위: " + thread2.getPriority());
thread1.start();
thread2.start();
}
}
```
- 출력 (실행 순서는 보장되지 않음):
```
Thread 1 우선순위: 1
Thread 2 우선순위: 10
Thread 2 실행
Thread 1 실행
```
#### 6. `yield()`
- 현재 스레드가 다른 스레드에게 실행 기회를 양보합니다. CPU 스케줄링에 따라 결과가 달라질 수 있습니다.
```java
class YieldThread extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " 실행 중");
Thread.yield(); // 다른 스레드에게 양보
}
}
}
public class YieldExample {
public static void main(String[] args) {
Thread thread1 = new YieldThread();
Thread thread2 = new YieldThread();
thread1.start();
thread2.start();
}
}
```
- 출력 (순서 무작위):
```
Thread-0 실행 중
Thread-1 실행 중
Thread-0 실행 중
Thread-1 실행 중
...
```
---
### 결론
자바의 `Thread` 클래스는 스레드 생성, 실행, 제어를 위한 다양한 메서드를 제공합니다. `start()`와 `run()`으로 스레드를 시작하고, `sleep()`, `join()`, `interrupt()`로 동작을 제어하며, `setPriority()`와 `yield()`로 스케줄링을 조정할 수 있습니다. 위 예시를 통해 각 메서드의 동작을 이해하고, 실제 멀티스레드 프로그래밍에 적용해 보세요!