애너테이션의 타입 정의하기
@interface 애너테이션 이름 {
타입 요소이름(); } //애너테이션의 요소 선언
**@Override는 애너테이션이고 Override는 애너테이션의 타입이다
애너테이션의 메서드는 추상 메서드이며, 애너테이션을 적용할 때 지정한다(순서x)
애너테이션의 요소
애너테이션 내에 선언된 메서드로 반환값이 있고 매개변수는 없는 추상메서드의 형태를 가진다
애너테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해주어야 한다
요소가 하나이고 이름이 value일 때는 요소의 이름 생략가능
요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다
java.lang.annotation.Annotation
Annotation은 모든 애너테이션의 조상이지만 상속이 불가하다
public interface Annotation //Annotation 자신은 인터페이스이다
마커 애너테이션 Marker Annotation
요소가 하나도 정의되지 않은 애너테이션이다
애너테이션 요소의 규칙
-요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용된다
-()안에 매개변수를 선언할 수 없다
-예외를 선언할 수 없다
-요소를 타입 매개변수로 정의할 수 없다
프로세스와 쓰레드
프로세스 : 실행중인 프로그램, 프로그램을 실행하면 OS로부터 자원(메모리)을 할당받는다
쓰레드 : 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이다
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다
프로세스 : 쓰레드 = 공장 : 일꾼
*하나의 새로운 프로세스를 생성하는 것보다
하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다
멀티쓰레드의 장단점
대부분의 프로그램이 멀티쓰레드로 작성되어 있다
장점 | -Cpu의 사용률을 향상시킨다 -시스템 자원을 보다 효율적으로 사용할 수 있다 -사용자에 대한 응답성이 향상된다 -작업이 분리되어 코드가 간결해진다 |
단점 | -동기화(synchronization)에 주의해야한다 -교착상태(dead-loce)가 방생하지 않도록 주의해야 한다 -각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다 ->프로그래밍할 때 고려해야 할 사항들이 많다 |
쓰레드의 구현과 실행
1. Thread 클래스를 상속 class MyThread extends Thread { public void run() { } //Thread클래스의 run()을 오버라이딩 } |
2. Runnable 인터페이스를 구현 class MyThread implements Runnable { public void run() { } //Runnable인터페이스의 run()을 구현 } |
static Thread currentThread() //현재 실행중인 쓰레드의 참조를 반환한다
String getName() //쓰레드의 이름을 반환한다
쓰레드의 실행 – start()
쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다
start()와 run()
1. main메서드에서 쓰레드의 start()를 호출
2. start()는 새로운 쓰레드를 생성하고 쓰레드가 작업하는데 사용될 호출스택을 생성
3. 새로 생성된 호출스택에 run()이 호출되어 쓰레드가 독립된 공간에서 작업 수행
4. 호출스택이 2개이므로 스케줄러가 정한 순서에 의해 번갈아가면서 실행된다
main쓰레드
main메서드의 코드를 수행하는 쓰레드
메인쓰레드가 수행을 마쳐도 다른 쓰레드가 작업을 마치지 않은 상태면 프로그램이 종료되지 않는다
->>>실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다
쓰레드는 사용자 쓰레드와 데몬 쓰레드(보조쓰레드) 두 종류가 있다
**자바가 OS(플랫폼)에 독립적이라고 하지만. 종속적인 부분이 몇 가지 있는데
쓰레드가 이에 해당한다
싱글쓰레드와 멀티쓰레드
쓰레드간의 작업전환 시간이 걸리기 때문에 멀티쓰레드의 시간이 더 걸리지만,
시간이 걸리더라도 동시에 할 수 있다는 장점이 있다 (작업을 효율적으로 할 수 있다)
싱글코어에서 단순히 cpu만을 사용하는 계산작업의 경우에는 싱글쓰레드로 프로그래밍 하는 것이 효율적이다
**프로세스 또는 쓰레드간의 작업전환을 컨텍스트 스위칭이라고 한다**