[24.06.27] JAVA_멀티스레드

ANGELA·2025년 1월 8일

[KB]학습내용정리

목록 보기
8/57

01. 스레드 개념

1. 종류

메인 스레드 : main() , 이미 만들어져있다.
작업 스레드 : 메인 안에서 또 만들었다.

2. 스레드 종료

c /c++ : main 죽으면 다 죽음
java : 스레드 모두 끝나야 종료

02. 작업 스레드

  • I/O : 자바는 기본적으로 동기 방식
  • 동기 기다리는 시간 아끼려고, 스레드로 나눈것
  • GUI, network : 스레드 필수

03. 기법

1. 직접

  • 인터페이스
  • runnable 써야한다.
💡 이게 더 많이 사용함

2. 상속

  • 자바 다중상속 안됨
  • 다중상속 안될때 → 인터페이스 implement 써야한다,

3. 서버

  • 스레드 올때마다 끄고, 킨다. → 오버헤드 있다. → 그래서 스레드 풀을 만들어 놓고, 배정한다.
  • 스레드 풀 : 코어 갯수 만큼 만든다
    - 스레드 미리 만들어놓고 재워놔 (sleep()) → 깨워 → 배정해 → 요청 들어와 또 깨워 또 배정해
    더이상 없어→ 이제 기다려 
    
    - 코어 갯수 4개면 , 4개 만들어서 재워놓는다.

04. 예외 처리 중요

안했을때, 일반적으로 어플이 죽는다.

05. Cli 프레임워크

  • 만드는 순서

06. 오후수업

  • 프리미티브 종류 : 불린, 차, 바이트8, 쇼트16, 인트32, 롱64, 플롯32, 더블64,
  • 리플렉션 : 정보 추출
    • 코드 재사용에 유용하다
  • 어노테이션 : 커스텀할 수 있다.
## 1교시
wrapper 클래스
Java의 래퍼 클래스는 객체가 primitive 데이터 유형을 래핑하거나 포함하는 클래스입니다.
래퍼 클래스에 객체를 생성하면 필드가 포함되며 이 필드에 기본 데이터 유형을 저장할 수 있습니다., 기본 값을 래퍼 클래스 객체로 래핑할 수 있습니다.

#### Java에서 Wrapper 클래스를 사용하려면 특정 요구 사항이 있습니다.

1. 기본 데이터 유형을 객체로 변환합니다. 메소드에 전달된 인수를 수정하려면 객체가 필요합니다(기본 유형은 값으로 전달되기 때문).
2. java.util 패키지의 클래스는 객체만 처리하므로 래퍼 클래스도 이 경우에 도움이 됩니다.
3. arraylist 및 vector 와 같은 Collection 프레임워크의 데이터 구조는 기본 유형이 아닌 객체(참조 유형)만 저장합니다.

#### 래퍼 클래스의 장점

1. 컬렉션의 요소는 객체 데이터만 허용됩니다.
2. ObjectcompareTo(), equals(), toString() 등 여러 내장 메서드를 사용할 수 있습니다.
4. 객체에는 null값을 사용할 수 있습니다
5. 직렬화를 사용할 수 있습니다

### 오토박싱

기본 유형을 해당 래퍼 클래스의 객체로 자동 변환하는 것을 오토박싱이라고 합니다. 예를 들어 intInteger, longLong으로, doubleDouble로 변환하는 것입니다.

- 해당 래퍼 클래스의 **개체를 기대하는** 메서드에 매개 변수로 전달됩니다 .
- **해당 래퍼 클래스** 의 변수에 할당됩니다 .

### 언박싱
이는 오토박싱의 반대 과정일 뿐입니다. 래퍼 클래스의 객체를 해당 기본 유형으로 자동 변환하는 것을 언박싱이라고 합니다. 예를 들어 Integerint, Longlong으로, Doubledouble로 변환 등입니다.

## 2교시

**## util 패키지**
유틸 패키지 종류
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/package-summary.html

**## 리플렉션**

인스턴스, 클래스의 정보를 역으로 추출해내 사용하는 방법
클래스, 생성자, 매서드, 필드 등을 추출해낼 수 있다

instance.getClass() : 객체가 속한 클래스의 이름을 가져오는 데 사용
instance.getConstructors() : 객체가 속한 클래스의 public 생성자를 가져오는 데 사용
instance.getMethods() :객체가 속한 클래스의 public 메소드를 가져오는 데 사용
Class.getDeclaredMethod(): 메서드 >> Method.invoke(): 메서드를 호출
 클래스의 메서드가 매개 변수를 허용하지 않으면 null이 인수로 전달됩니다.
Class.getDeclaredField(FieldName): private 필드를 가져오는 데 사용됩니다.
Field.setAccessible(true): 필드와 함께 사용된 액세스 한정자와 관계없이 필드에 액세스
 peivate에도 접근 가능, 캡슐화를 깰 수 있다.

### 어노테이션
1. Marker Annotations : 멤버가 없음
@TestAnnotation

3. Single value Annotations : 멤버가 하나만 있기 때문에 해당 멤버의 값 하나만 전달하면 됨
@TestAnnotation(“testing”);

5. Full Annotations: 멤버가 여러개 들어가기 때문에 멤버명이 포함됨
@TestAnnotation(owner="me", value="steve")

7. Type Annotations : 타입 앞에 붙음
@TypeAnnoDemo String string = "I am annotated with a type annotation";

9. Repeating Annotations : 단일 항목에 두 번 이상 적용될 수 있는 어노테이션
어노테이션을 정의할 때 @Repeatable 을 붙여야함
>> @Annotation(value={@Words(value=1, word="First"), 
	@Words(value=2, word="Second")})

## 3교시

### 쓰레드
멀티스레딩은 CPU 활용도를 최대화하기 위해 프로그램의 두 부분 이상을 동시에 실행할 수 있는 Java 기능입니다. 
이러한 프로그램의 각 부분을 스레드라고 합니다. 
따라서 스레드는 프로세스 내의 경량 프로세스입니다.

쓰레드 extends VS implements
주요 차이점은 클래스가 Thread 클래스를 extends 하면 다른 클래스를 extends할 수 없지만 Runnable 인터페이스를 implements 하면 class 와 같이 다른 클래스도 extends가 가능하다는 것입니다 

MyClass extends OtherClass implements Runnable {}

### 동시성 문제
스레드는 프로그램의 다른 부분과 동시에 실행되기 때문에 코드가 어떤 순서로 실행되는지 알 수 있는 방법이 없습니다. 스레드와 기본 프로그램이 동일한 변수를 읽고 쓰는 경우 값을 예측할 수 없습니다. 이로 인해 발생하는 문제를 동시성 문제라고 합니다.

### 쓰레드의 우선순위
스레드에 대해 허용되는 우선순위 값은 1에서 10 사이입니다.

### 쓰레드 풀
- 여러 개의 쓰레드를 유지/관리하기 위해서 사용한다.
- 미리 설정해준 크기만큼 쓰레드들을 만들어 두고, 해당 쓰레드들을 계속해 재사용할 수 있게 한다.

### 동기화 (syncronized)
한 번에 하나의 스레드만 내부에서 실행되도록 하는 키워드
syncronized 메서드 : syncronized 가 붙은 메서드
syncronized 블록: syncronized 키워드를 사용하여 인스턴스가 대입된 블록
profile
혼자 보려고 만든 기록장 | 또또는 귀여워 🐈‍⬛

0개의 댓글