쓰레드(Thread)
프로세스 안에서 두가지 이상의 일을 하도록 도와준다.
시간분할 방식
=> 모든 프로세스에게 동일한 시간을 할당하고 골고루 실행한다.
선점형 방식
=> 각각 프로세스에 우선순위를 부여하고 높은 순서로 하나씩 실행하고, 잠시 멈추면 그 다음 순위 프로세스가 동작한다.
쓰레드 생성
1. Thread 클래스를 상속받는다.
class Th1 extends Thead{ // Th1 클래스로 Thread 클래스를 상속받음
public void run() { // Thread 클래스의 run 메서드를 오버라이딩
// 작업할 내용
}
}
Th1 t1 = new Th1();
t1.start(); // 실행
Thread 클래스 내의 run() 메서드를 오버라이딩한다.
2. 인터페이스를 사용한다.
class Th2 implements Runnable { // Runnable 인터페이스를 상속받음
public void run() { // 추상 메서드인 run을 오버라이딩
// 작업할 내용
}
}
Th2 t2 = new Th2(); // Th2의 주소를 저장한 t2 객체 생성
Thread t = new Thread(t2); // t2를 Thread 클래스에 인수로 전달하여 스레드 생성
t.start(); // 실행
만약 싱글코어 CPU를 탑재한 컴퓨터에서 쓰레드를 적용한 A, B 클래스가 있고 메인클래스 C가 있다면 A, B, C 클래스가 거의 비슷한 횟수로 실행된다.
하지만 요즘 컴퓨터는 CPU 코어의 갯수가 많기 때문에 A와 B클래스에 슬립을 걸더라도 남는 코어를 이용해서 C클래스를 실행해버리기 때문에 C클래스가 A,B클래스보다 우선순위는 낮더라도 빠르게 끝날 가능성이 높다.
쓰레드의 라이프사이클
new
: 쓰레드가 new를 통해 인스턴스화된 상태로, Runnable이 될 수 있는 상태이며 아직 대기열에 올라가지 않은 상태이다.
Runnable
: start() 메서드가 호출되면 new에서 Runnable 상태가 되며, 실행할수 있는 상태로 대기하고, 스케쥴러에 의해 선택되면 run()메서드를 바로 수행한다.
Blocked
: 실행중인 쓰레드가 sleep(), join() 메서드를 호출하면 Blocked 상태가 되며, 스케쥴러에 의해 선택 받을수 없다.
Dead
: run() 메서드의 실행을 모두 완료하면 Dead 상태가 되며 할당받은 메모리와 정보가 삭제된다.
sleep()
: 쓰레드를 지정된 시간동안 block 상태로 만들며 시간은 1/1000초 단위로 지정하고, 시간이 지나면 다시 Runnable 상태가 된다.
sleep()을 이용해서 1초마다 실행되게 하면 카운트 다운을 만들수 있다.
Thread.sleep(1000); // 1초동안 쓰레드를 block
join()
: 특정한 쓰레드가 작업을 먼저 수행할 때 사용하며, 실행순서를 지켜야 하는 쓰레드들을 제어한다.
t1.start(); // t1 실행
t1.join(); // t1이 완료될때까지 다른 쓰레드들이 대기함
쓰레드 동기화
멀티쓰레드로 작업할 때, 쓰레드간의 작업이 간섭되지 않도록 하는것이다.
public synchronized void 메서드명() {
// 수행할 작업
}
주로 영화관등의 좌석을 예매할때 앞사람이 좌석을 예매하는 중에는 다른 사람들이 그 좌석을 선택할수 없게 만드는 기능이다.
이로써 앞사람이 그 좌석을 예매했던 안했던 관계 없이 뒷사람이 일정시간동안 그 좌석을 선택할수 없기 때문에 서로 동일한 좌석을 예매할수 없게된다.
wait(), notify()
쓰레드가 동기화를 통해 객체의 lock을 한 상태라면 작업이 완료될 때까지 데이터를 보호하지만, lock을 가진 스레드의 작업이 특정 이유로 완료되지 못하게 되면 lock을 반납하지 못하게 되므로 이를 해결하기 위해 wait()와 notify()를 사용한다.
wait()
: 현재 진행중인 쓰레드의 lock을 반납하게 하고 대기상태로 전환하여 다른 쓰레드가 작업을 할수 있게 한다.
쓰레드 A, B, C가 있고 A가 먼저 작업을 하던중 wait() 메서드가 실행되면 A는 작업을 멈추고 lock을 반납하고 대기 상태가 된다.
notify()
: 대기중인 다른 쓰레드를 하나 깨워 작업을 하게 한다.
이후 B가 작업중 notify() 메서드를 실행하면 대기하던 A를 깨우고 B는 싱크로나이즈까지 작업을 끝낸 후 C가 아닌 A에게 작업을 넘긴다. A가 작업을 끝내면 C에게 작업을 넘긴다.
IO와 스트림(Stream)
IO
: Input과 Output을 뜻하며 프로그램에 들어오는 모든 값을 입력, 나가는 모든 값을 출력이라 하며, 이를 입출력이라 한다.
스트림(Stream)
: 자바에서 데이터의 흐름을 의미하며, 데이터 통신은 한쪽 방향으로만 가능하다는 특징이 있어 입력과 출력 스트림을 따로 사용해야 하고, 먼저 들어온 데이터가 먼저 나가는 FIFO 구조를 이루고 있다.
바이트기반 스트림
1byte씩 읽어서 1byte씩 출력한다.
입력 스트림 | 출력 스트림 | 대상 |
FileInputStream | FileOutputStream | 파일 |
PipedInputStream | PipedOutputStream | 메모리 |
AudioInputStream | AudioOutputStream | 오디오 |
ByteArrayInputStream | ByteArrayOutputStream | 프로세스 |
* 주로 파일과 메모리를 사용한다.
바이트 기반 보조 스트림
기본 바이트 스트림(InputStream, OutputStream)의 성능을 향상시키는 역할을 한다.
버퍼를 사용하여 데이터를 일정량 모아서 한 번에 입출력함으로써 성능을 최적화한다.
파일, 네트워크, 메모리 등의 입출력 작업에서 사용되며, 입출력 지연을 줄이고 처리 속도를 높이는 데 효과적이다.
입력 보조 스트림 | 출력 보조 스트림 | 사용 |
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 |
BufferdInputStream | BufferdOutputStream | 버퍼를 통해 입출력 |
DataInputStream | DataOutputStream | 기본형 단위로 데이터 처리 |
없음 | PrintStream | print, printf, println |
'프로그래밍 공부' 카테고리의 다른 글
2025.02.06 JSP 공부 (0) | 2025.02.06 |
---|---|
2025.02.05 java 공부 (0) | 2025.02.05 |
2025.02.03 java 공부 (0) | 2025.02.03 |
2025.01.24 java 공부 (0) | 2025.01.24 |
2025.01.23 java 공부 (0) | 2025.01.23 |