프로그래밍

[자바 기초] day14 : 스레드(Tread) 본문

자바/자바 기초

[자바 기초] day14 : 스레드(Tread)

시케 2023. 5. 22. 10:47
728x90
반응형

2023.05.22.월

스레드

메모리를 할당받은 프로세스에서 실질적인 작업을 수행하는 주체

 

프로세스

실행중인 프로그램

 

프로그램 --> 실행 상태 --> 프로세스 순으로 진행되며
일(동작)할 수 있게 메모리(자원)을 할당받은 상태이다

 

프로세스가 진행되는 방식

 

선점형 방식: 우선순위대로 자원을 할당받아 진행되는 방식
 ->기아현상 발생 가능성 있다


시분할 방식: 시간을 동일하게 배분하여 골고루 실행될 수 있도록 진행하는 방식
-> 기존의 선점형 방식에서 우선순위가 낮아 오래 기다린 프로세스의 우선순위를 높여준다

 

이러한 프로세스 진행은 OS(운영체제)의 스케줄러가 담당한다

 

스레드의 생명주기

스레드는 생명주기에 맞게 실행된다

  1. 생성
  2. 대기
  3. 수행
  4. 데드

스레드를 실행시 run() 메서드가 실행된다

스레드는 생성 휴 즉시 대기 상태가 되며 대기상태는 수행 직전까지 유지된다

스래드가 해당 일을 수행한 후 데드 상태가 되어 가진 자원을 반환한다

 

이때 주의할 점은 스레드 객체들은 독립적으로 일을 수행하므로

스레드끼리의 순서가 정해져 있지 않다

 

이러한 상황에서 스레드를 조절하기 위해

블록처리를 할 수 있다

 

스레드 블록처리

자원(메모리)을 할당받지 못하도록 막아둔 상태

 

 

예제)

package class01;

// 이미 자바에서 구현한 스래드 클래스 가져다가 사용
// 코드를 재사용할 예정
// 상속
class Th01 extends Thread{

	@Override
	public void run() {
		for(int i = 0; i<=10; i++) {
			System.out.println("Thread 01 " +i);
		}
	}
}

class Th02 extends Thread{
	@Override
	public void run() {
		for(int i = 0; i<=10; i++) {
			System.out.println("Thread 02 " +i);
		}
	}
} 

public class Test01 {

	public static void main(String[] args) {
		// 생성
		Th01 t1 = new Th01();
		Th02 t2 = new Th02();
		
		//대기
		
		//수행
		t1.start(); // 스레드 실행 -> run()메서드 실행
		t2.start(); 
		
		// 블록: 자원(메모리)을 할당받지 못하도록 막아둔 상태
		for(int i=0; i<10; i++) {
			System.out.println(i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			} // 1000 == 1초
		}
	}
}

이미 자바에서 스레드 클래스를 구현해 놓았기 때문에 손쉽게 상속받아 사용할 수 있다

 

 

동기화

스레드는 독립적으로 실행되기 때문에
공유자원을 어떤 스레드가 점유하고 있을때'
다른 스레드의 접근을 막아야 한다.

package class01;

class Person extends Thread {
	Ticketting t = new Ticketting(); // 설명을 위해 클래스내에서 선언
	
	@Override
	public void run() {
		t.pay();
	}
	
}

class Ticketting {
	static int ticket = 2; // 공유자원, 클래스 변수
	synchronized void pay() {
		if(ticket>0) {
			System.out.println(Thread.currentThread().getName()+" 구매 성공!");
			ticket--;
		}
		else {
			System.out.println(Thread.currentThread().getName()+" 구매 실패");
		}
		System.out.println("남은 티켓: "+ticket);
	}
}

public class Test02 {

	public static void main(String[] args) {
		Person p =new Person();
		Thread t1 = new Thread(p, "홍길동"); //각 사람마다 2개로 보임 
		Thread t2 = new Thread(p, "아무무");
		Thread t3 = new Thread(p, "티모");
		
		t1.start();
		t2.start();
		t3.start();
	}

}

 

위의 코드를 통해 다음과 같은 추론을 할 수 있다.

자바의 Thread 클래스에는

  1. 멤버변수 name을 가지고 있다
  2. 멤버변수 name은 private 접근제한자로 선언되어있다
  3. 기본생성자가 있다
  4. 스레드 객체와 이름을 받는 생성자가 있다
class Thread{
 private String name;
 Thread(){
   this(new Thread(),null);
 }
 Thread(Thread thread,String name){
   this.name=name;
 }
 getter,setter
}

따라서 위와 같은 형태를 예측할 수 있다

(실제론 더욱 복잡하다)

728x90
반응형
Comments