(2024-04-24)자바 문법 종합반 예외처리,쓰레드
에러 & 예외
에러(Error)
:에러는 일반적으로 회복이 불가능합니다.코드문제로 발생하기도 하지만 보통 시스템 레벨 또는 환경적 요인으로 에러가 납니다.에러가 난 경우 어떤 프로그램이 종료됐는지 를 확인하고 대응 해야합니다.
예외(Exception)
:예외는 일반적으로 회복이 가능합니다. 코드레벨 에서 할수 있는 대응들은 예외에 속합니다.
에러 & 예외 종류
-컴파일 에러(예외)
: .java파일을 .class로 변환할 때 발생하고 문법적 문제로 주로 발생 한다.
-런타임 에러(예외)
:컴파일은 잘 되었지만 프로그램 실행 도중 맞닥드리는 예외이다.
throws
:메소드 이름 뒤에 붙어 어떠한 예외 상황을 던질 수 있는지 알리는 예약어 이다.
throw
:메소드 안에서 실제 예외 객체를 던질 때 사용하는 예약어 이다.
프로세스 & 쓰레드
프로세스
:운영체제로 부터 자원을 할당받는 작업의 단위
프로세스의 구조
:os가 프로그램 실행을 위해 프로세스를 할당해줄 때 프로세스안에 프로그램 코드 와 데이터 그리고 메모리영역(Stack,Heap)을 함께 할당해줍니다.
코드: 자바 main메소드 와 같은 코드를 말한다.
데이터 : 프로그램 실행중 저장할 수 있는 저장공간을 말한다.(전역변수,정적변수(static),배열등 초기화된 데이터를 저장하는 공간 )
메모리 영역 :
-Stack : 지역변수, 매개변수, 리턴변수를 저장하는 공간
-Heap : 프로그램이 동적으로 필요한 변수를 저장하는 공간(new(),mallok() )
쓰레드
:프로세스가 할당받은 자월을 이용하는 실행의 단위,프로세스가 작업중인 프로그램 실행 요청이 들어오면 쓰레드를 만들어 명령을 처리한다.
싱글쓰레드
:자바에서 main메소드만 실행 했다면 이것은 싱글쓰레드 방식이다
멀티쓰레드
:프로세스 안에서 여러개의 쓰레드가 실행되는 것 을 말한다.
-장점 : 성능이 좋아지고 자원관리를 효율적으로할 수 있다. 그리고 비동기 처리가 가능하다.
-단점: 자원을 같이 이용하기 때문에 충돌이 일어나 동기화 문제가 생길수 있고 둘이상의 쓰레드가 서로 자원을 원하는 상태라 교착상태(DeadLock) 이 발생할 수 있다.
for (int i = 0; i < 100; i++) {
System.out.print("$");
}
};
Runnable task2 = () -> {
for (int i = 0; i < 100; i++) {
System.out.print("*");
}
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task2);
thread2.setName("thread2");
thread1.start(); //동시에 실행됨
thread2.start(); //동시에 실행됨
람다 식 을 이용해 Runnable객체 생성후 멀티쓰레드 방식으로 실행
데몬쓰레드
:우선순위가 낮은 쓰레드 대표적으로 JVM에 가비지컬렉터(GC)가 있다
setDaemon(true) 메소드를 사용하여 데몬쓰레드로 지정한다
사용자 쓰레드
:우선순위가 높은 쓰레드 대표적으로 main쓰레드가 있다 기존에 직접적으로 만든 쓰레드도 사용자 쓰레드에 해당한다.
쓰레드 운선순위
- 최대 우선순위 (MAX_PRIORITY) = 10
- 최소 우선순위 (MIN_PRIORITY) = 1
- 보통 우선순위 (NROM_PRIORITY) = 5
기본값이 보통우선순위 이다.
setPriority()메소드를 사용해서 우선순위 결정
쓰레드 그룹
:서로 관련있는 쓰레드들을 묶어서 관리 할 수 있다.
쓰레드 그룹 생성
Thread thread2 = new Thread(group1, task, "Thread 2");
오버로딩된 Thread클래스이 생성자로 첫번째 인자에 이전에 생성한 group을 넣어준다.
쓰레드 제어
sleep():현제 쓰레드를 지정된 시간동안 멈추게 합니다. sleep을 통해 쓰레드를 잠재울 때는 exception처리를 반드시 해야한다.
그리고 sleep자체가 static메소드이기 때문에 특정 쓰레드를 sleep하는건 의미가없고 Thread.sleep(2000) 이런식으로 사용해야한다.
interrupt():일시정지 상태인 쓰레드를 실행 대기 상태로 만든다
join():지정한 시간동안 쓰레드가 작업하는 것을 기다린다.
yield():남은 시간을 다음 쓰레드에게 양보하고 쓰레드 자신은 실행 대기 상태가된다.
synchronized:실행할 메서드 또는 실행할 코드 묶음 앞에 synchronized를 붙여서 임계 영역을 지정하여 다른 쓰레드의 침범을 막을 수 있습니다. (침범을 막다. = Lock을 걸다.)
public synchronized void asyncSum() {
...침범을 막아야하는 코드...
}
if (storedApple > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
storedApple -= 1;
}
}