[Thread][스레드]

stan·2023년 5월 22일
0

Java 개념

목록 보기
26/33

[스레드]
CS 상식
Thread (진짜로 작업을 하고 있는 친구)
메모리를 할당받은 프로세스에서
실질적인 작업을 수행하는 주체

프로세스
실행중인 프로그램
프로그램 --실행상태--> 프로세스
일(동작)할수있게 메모리(자원)를 할당받은 상태

★기사시험

프로세스가 실행되는 방식
(과거에는) 선점형 방식 : 우선순위 순서대로 자원(메모리)을 할당받아 진행되는 방식
우선순위가 낮으면 오랫동안 실행 되지 않음
사용자가 그 사이에 우선순위가 높은 프로그램을 실행 시키면 그게 먼저 실행됨
-> 기아현상이 발생될 가능성이있었음
시(간)분할 방식 : 시간을 동일하게 배분하여 골고루 실행될수있도록 진행하는 방식
=> 기존의 선점형 방식에서 우선순위 낮아 오-래 기다린 프로세스에게
우선순위를 높여주는 방식
=> OS(운영체제)의 '스케줄러'

day14

package class01;

// 이미 JAVA에서 구현한 Thread 클래스를 가져다가 사용
// 코드를 재사용할 예정
// => 상속 
class Th01 extends Thread{ //<<부모 클래스Thread 가 기본 생성자를 가지고 있기 때문에 Th01자식 클래스에서도 super() 이슈가 없음

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

	@Override
	public void run() {
		for(int i=1; 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(); // 스레드 객체야, 일해! <<너 일해 
		t2.start(); // -> run()메서드를 실행시킴 <<너도 일해 
		//메모리를 먼저 할당 받는 쪽이 먼저 출력이 되는 것 뿐임 
		
		//start()로인해 본인이 구현 해 놓은 run()을 수행하게 되고,
		// 주어진 run()을 다 수행하게 되면
		// 데드상태가 됨 
		
		// 스레드 객체들은 현재 독립적으로 일을 수행하고있구나! 
		
		/* 웹개발 특
		 * 5개 남은 상품
		 * t1(사용자1) -> 장바구니에 3개담음
		 * t2(사용자2) => 5개를 즉시구매 //<<왜 되요?
		 */
		
		// 스레드 생명주기(라이프사이클)
		// 생성 -> 대기 -> 수행 -> 데드 
		// 블록 : 자원(메모리)을 할당받지못하도록 막아둔상태
		
		for(int i =1; i<=10;i++) {
			System.out.println(i); //1이 먼저 프린트 되는건 운빨임; 아마 메인에 있어서 높은 확률로 먼저 나오는거 
			try {
				Thread.sleep(1000); //1000 milliseconds == 1 sec
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

가족공동 계좌

package class01;
/*
가족 공동 계좌
10000원
가족들은
5000원씩 사용
가족 구성원은 3명
이때, 결제에 실패한 가족의 이름을
console에 출력!
 */
class Family extends Thread {
	Account a = new Account();//?????

	// thread.start() -> run()메서드가 수행
	@Override
	public void run() {
		super.run();
		a.spend();
	}
}

class Account {
	static int money = 10000; //공동계좌 공유자원
	static int spending = 5500;
	synchronized void spend() {
		if(money >=spending) {	//1)스레드가 멤버변수로 Name을 갖고 있다; 2)Thread t1 = new Thread(f,"Name"); <<Name자리이다
			System.out.println(Thread.currentThread().getName()+" 결제 성공"); 
			money-=spending;
		}
		else {
			System.out.println(Thread.currentThread().getName()+" 결제 실패");
		}
		System.out.println("남은 돈 "+money);
	}
}

public class Test03 {
	public static void main(String[] args) {
	
		Family f = new Family();
		Thread t1 = new Thread(f,"홍길동");
		Thread t2 = new Thread(f,"아무무");
		Thread t3 = new Thread(f,"티모");
		
		t1.start();
		t2.start();
		t3.start();
	}
}

Thread.currentThread().getName() <<== 이걸 보면 알 수 있는 두가지 :
- 1)스레드가 멤버변수로 Name을 갖고 있다;
- 2)Thread t1 = new Thread(f,"Name"); <<Name자리이다

아마 이렇게 생기지 않았을까?

class Thread {
	private String name;
	Thread() {
		this(new Thread(),null);
	}
	Thread(Thread thread, String name) {
		this.name=name;
	}
 getter,setter
}
profile
이진 입니다

0개의 댓글

관련 채용 정보