230510 day26 개념 정리

Jin·2023년 5월 25일
0

codenotion

목록 보기
23/90
post-thumbnail
제네릭 
: 결정되지 않은 타입을 타입파라미터로 처리하고, 
실제 사용할 때 파라미터를 타입으로 대체하는 기능

<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()메소드를 종료시킬 수 있음 
profile
신입 개발자의 배웠던 것을 복습하기 위한 블로그입니다.

0개의 댓글