본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

2022년 12월 09일 _ 23회차 (종속 Thread,독립 Thread,동기화)

by 초응 2022. 12. 9.

스레드의 객체는 스레드와 흐름을 가지는 스레드 2개의 객체를 가지고 있다. <- 내용 확인하기 ㅎㅎ...

 

객체를 할당받는 방법(면접 팁)
1. 프로토 타입 방식 :  내가 필요할 때마다 객체를 만들어서 할당받는 방식. (new)
2. 싱글턴 : 객체가 이미 만들어져 있고 만들어있는 것을 제공받는 형식.(재활용하는 방식)
ㄴ Calendar가 싱글턴 방식의 대표. 

 

// 싱글턴은 getInstance()메소드를 호출한다.


 

종속 스레드 : 메인이 끝나면 끝남/ 메인이 끝나도 jvm이 스레드를 수거하는 동안 종속 스레드는 돌아감.

##.setDaemon(true);  

##.isDaemon() : 너 데몬이니?

독립 스레드 : 주 스레드로부터 파생되지만 주스 레드와 별개로 활동
메인이 끝나도 구동됨 (ex. 음악 프로그램을 끈다해도 백그라운드로 계속 재생됨)

package day23;
class ThreadA extends Thread{
	public void run() {
		System.out.println("**ThreadA의 시작**");
		for(int i=1;i<=50;i++) {
			System.out.println("**ThreadA의 값:"+i+"**");
		}
		System.out.println("**ThreadA의 끝**");
	}
}
public class ThreadTest {

	public static void main(String[] args) {

		ThreadA ta = new ThreadA();
		ta.setDaemon(true);
		ta.start(); //독립스레드.
		System.out.println("너 데몬이니?"+ta.isDaemon());

		System.out.println("==main의 시작==");
			
		for(int i=1;i<=10;i++) {
			System.out.println("==메인의 값"+i+" ==");
			}
		System.out.println("==main의 끝==");
	}
}


[스레드 동기화]
1. Static변수를 이용하기
2. 동기화할 대상들을 referense로 주소값을 공유

스레드는 분산 처리 기법.
- 길이 독립적으로 구현되어있음. 특정 데이터를 공유할때 충돌이 발생한다.


직렬화 하기 : (줄을 세우기 ) synchronized 
장점 : 논리적인 오류에서 벗어날 수 있음.
단점 :  분산처리 하는 이유는 빨리 처리하려고 하는 건데 직렬화를 하면 순서대로 가야 하기 때문에 속도 저하가 일어남.

package day23;
class Bank{
	private int money;
	synchronized public void bSave(String name, int money) {
		this.money = money+this.money;
		System.out.println(name+"가"+money+"원을 입금하여"+this.money+"원 잔액이 남았습니다.");
	}
	synchronized public void bLoad(String name, int money){
		if(this.money<money) {
			System.out.println("잔액이 부족합니다.");
			return;
			
		}
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		this.money = this.money-money;
		System.out.println(name+"가"+money+"원을 출금하여"+this.money+"원 잔액이 남았습니다.");
	}
}

class Parent extends Thread{
	String name;
	Bank bank;

	public Parent() {
	}
	public Parent(String name,Bank bank) {
		this.name = name;
		this.bank = bank;
	}
	
	@Override
	public void run() {
		for(int i = 0;i<=5;i++) {
			int save = (int)(Math.random()*5+1)*100;
			int load = (int)(Math.random()*5+1)*100;
			bank.bSave(name, save);
			bank.bLoad(name, load);
		}
	}
}
public class ThreadTest2 {

	public static void main(String[] args) {
		
		Bank b = new Bank();
		
		Parent mama = new Parent("엄마",b);
		Parent papa = new Parent("아빠",b);
		
		mama.start();
		papa.start();
	}

}