제네릭
: 결정되지 않은 타입을 타입파라미터로 처리하고,
실제 사용할 때 파라미터를 타입으로 대체하는 기능
<T>
타입이 필요한 자리에 T를 사용 (A-Z 가능)
제네릭 타입
public class Box<T> {
// 필드
public T name;
public M model;
public Box(Tname) {
this.name = name;
}
// 메소드
public void setName(T Name){
this.name = name;
}
}
Box<String, Integer> box = new Box<String, Integer>();
Box<String> box = new Box<>();
public interface TV<P>{
// 추상 메소드 리턴 타입 P
P rent();
}
public class Smart TV implements TV<String> {
@Override
public String rent() {
return "스마트티비";
}
}
public class Box<T> {
public T content
public boolean compare(Box<T> other) {
boolean result = content.equals(other.content);
return result
}
}
Box box1 = new Box();
box1.content = "100";
Box box2 = new Box();
box2.content = "100";
Box box3 = new Box();
box3.content = "100";
제네릭 메소드
라이브러리 클래스
public class Box<T> {
// 필드
private T t;
// Getter 메소드
public T get() {
return t;
}
// Setter 메소드
public void set(T t) {
this.t = t;
}
}
실행 클래스
메소드
public static <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.set(t);
return box;
}
제한된 타입 파라미터
<P extends Car> Car타입이거나 Car클래스 상속받은 타입만 올 수 있다
와일드카드
<?>
<? extends Car>
<? super Worker>
프로세스와 스레드
프로그램 : 실행 가능한 파일(SSD)
프로세스 : 실행중인 프로그램(메모리)
프로세스 : 실행중인 프로그램, 자원과 스레드로 구성
스레드 : 프로세스 내에서 실제 작업을 수행
대부분의 프로그램이 멀티 스레드로 작성되있음
(동기화, 교착 상태 발생 주의)
메인 스레드
모든 자바 프로그램은 메인 스레드가 main메소드를 실행시키면서 시작됨
main()메소드 첫 코드부터 순차적으로 실행
main()메소드의 마지막 코드를 실행하거나 return문을 만나면 실행 종료
메인 스레드 확인
// 현재 스레드 객체를 리턴
Thread currentThread = Thread.currentThread();
currentThread.getName();
메인 스레드가 종료되면 프로세스 종료
멀티 스레드에서는 실행중인 스레드가 하나라도 있으면
프로세스가 종료되지 않음
1. Thread클래스로 직접 생성
Thread thread = new Thread(Runnable target);
Runnable인터페이스 구현 객체
1) 구현 클래스 작성
ex>
class RunnableChild implements Runnable {
void run() {
스레드가 작업할 내용
}
}
2) 익명구현객체 작성
ex>
Thread thread = new Thread(new Runnable() {
void run() {
스레드가 작업할 내용
}
})
2. Thread자식 클래스로 생성하기
작업 스레드 객체를 생성하는 방법은 Thread의 자식 객체를 만드는 것
Thread클래스를 상속받은 다음 run()메소드를 재정의하여
스레드가 실행할 코드를 작성하고 객체를 생성하면 됨
Thread.currentThread(); // 스레드 객체 참조
thread.getName(); // 스레드 이름 출력
thread.setName("스레드 이름");
main스레드 ---> main
작업스레드 ---> Thread-n
스레드 상태
스레드는 상태를 가진다
스레드 객체를 생성, start() 메소드를 호출
-> 실행대기상태(RUNNABLE)
실행대기하는 스레드는 CPU스케줄링에 따라서
CPU를 점유하고 run()메소드를 실행시킨다
-> 실행상태(RUNNING)
실행 상태에서 run()메소드가 종료되면
스레드의 실행을 멈춤
-> 종료상태(TERMINATED)
일시정지 관련 메소드
일시정지로 보냄
sleep() : 주어진 시간 동안 스레드를 일시정지, 시간이 지나면
자동으로 실행대기상태가 됨
join() : join()메소드를 호출한 스레드는 일시정지상태가 됨,
실행대기상태가 되려면 join()메소드를 가진 스레드가 종료되어야함
wait() : 동기화 블럭에서 일시정지 상태로 만듬
일시정지에서 벗어남
interrupt() : 일시정지상태일 때 InterruptedException을 발생시켜서
실행대기상태 또는 종료 상태로 만든다
notify(), notifyAll() : wait()메소드로 인해 일시정지상태인
스레드를 실행대기상태로 만듬
실행대기상태로 보냄
yield() : 실행 상태에서 다른 스레드에게 실행을 양보하고 실행대기상태가 됨
다른 스레드에게 실행 양보
yeild()메소드 호출 : 실행 중에 실행을 양보하고 실행대기상태로 돌아감
Thread.yield();
while(true) {
if(work) {
System.out.println("작업내용");
}
}
스레드 동기화
: 멀티스레드는 같은 객체를 공유해서 작업할 수 있다
1) 메소드 동기화
public synchronized void method() {
}
2) 블럭 동기화
public void method {
synchronized(공유객체) {
// 실행코드 (단 하나의 스레드만 실행하는 영역)
}
}
wait()와 notify()를 이용한 스레드 제어
동기화 메소드, 동기화 블럭 내에서만 사용 가능
wait() : 일시정지 상태로 만들어줌
notify() : wait()에 의해 일시정지된 스레드 하나를 실행대기 상태로 만들어줌
notifyAll() : wait()에 의해 일시정지된 모든 스레드를 실행대기 상태로 만들어줌
스레드 - 작업을 처리하는 실행흐름 (작업처리하는 일꾼)
메인스레드 하나만 사용 -> 싱글스레드
채팅, 파일 다운로드 동시에 불가능
하지만 멀티스레드는 동시에 실행 가능
스레드 안전종료
자신의 run()메소드가 모두 실행되면 자동으로 종료
1) 조건 이용
boolean타입 필드를 지정 -> 그 필드가 true면 멈추도록 함
PrintThread 클래스
stop 필드
setStop 메소드
2) interrupt()메소드 이용
스레드 일시정지 상태일 때 interrupt()메소드 호출하면
InterruptedException예외를 발생
예외처리를 통해 run()메소드를 종료시킬 수 있음