재밌고 어려운 IT를 이해해보자~!

쓰레드 본문

교육전 개인공부

쓰레드

언제나즐거운IT 2023. 10. 26. 23:47

스레드란 여러가지 작업을 동시에 하기위해 있는 클래스이며 extends Thread로 상속받아 사용한거나

Runnable사용

 

프로그램은 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태, 즉 실행되지 않은 코드의
집합을 말한다. 프로그램을 실행하는 순간 메모리에 올라가고 동작하게 되는데 이 상태의 프로그램을 프로세스라고 부른다.

 

프로세스는 쓰레드일수 있지만 쓰레드는 프로세스 일 수 없다. 프로세스가 스레드보다 큰 범위에 있다.
프로세스는 독립적으로 메모리에 등록된다.

 

Runnable을 상속하여 만든 객체는 Thread 객체에 넣어서 실행해야함. 

Runnable 사용법-

package study.code.thread;

public class Flag implements Runnable {

	@Override
	public void run() {
		
		for ( int i = 0; i < 10; i++) {
			if( i % 2 ==0) {
				System.out.println("백기올려");
			}else
				System.out.println("청기올려");
		}
	}
	
}



package study.code.thread;

public class FlagMain {

	public static void main(String[] args) {
		
		//Runnable을 상속하여 만든 객체는 Thread 객체에 넣어서 실행해야함. 
		
		Thread thflag = new Thread(new Flag());
		thflag.start();
		
		Runnable rn = () ->{	
			for(int i = 1; i <= 10; i++) {
				if( i%2 ==1 ) {
					System.out.println("백기올려");
				}else
					System.out.println("청기올려");
			}
		};
		System.out.println("================");
		Thread thflag2 = new Thread(rn);
		thflag2.start();
			
	}

}

 

Runnable로 상속받은 객체를 Thread 객체에 넣어 실행하거나,

Runnable로 선언된 메서드를 Thread 객체에 넣어서 실행한다.

또한....run()을 오버라이드 해서 메서드를 생성해야한다.

 

쓰레드2개가 돌다보면 동시에 같은자원에 접근할 수도 있고 그럴땐 에러가 날 수 있다.

따라서 동기화처리를 해줘야한다.

스레드를 동기화처리해주면 자원부여에 대한 순서부여가 가능해져서 스레드가 같은 자원을 점유해 발생하는 오류를 막을 수 있다.

 

동기화는 메서드를 동기화시켜줄 수 있으며, 원하는 부분만 부분동기화도 가능하다.

 

짐 쌓고 나르기 ex

package study.thread.state;

public class AddStack extends Thread {

	private Storage st;
	
	public AddStack(Storage st) {
		this.st = st;
		
	}
	
	public void run() {
		try {
			
			while(true) {
				Thread.sleep(100);
				if(this.st.getStackCount() == 0) {
					System.out.println("짐 추가 ");
					this.st.addStack(10);
				}
			}
			
			
		}catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}






package study.thread.state;

public class PopStack extends Thread {

	private Storage st;
	
	public PopStack(Storage st) {
		this.st = st;
		
	}
	
	public void run() {
		try {
			while(true) {
				Thread.sleep(100);
				System.out.println("짐 5개씩 나르기");
				this.st.popStack(5);
				
			}
			
			
		}catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}






package study.thread.state;

public class Storage {
	private int stackCount = 10; //물건 10개 가진다.
	
	public synchronized void addStack(int stackCount) {
		this.stackCount += stackCount;
	
		if(this.stackCount >= 10) {
			System.out.println("나르세요!");
			//스레드 깨우기
			notify();
		}
	}
	
	public synchronized void popStack(int leaveCount) {
		if(leaveCount > this.stackCount) {
			this.stackCount = 0;
		}else {
			this.stackCount -= leaveCount;
		}	
		System.out.println("현재 짐 개수 " + this.getStackCount());
			try {
				if(this.stackCount ==0) {
					System.out.println("집이 없음 대기");
					wait();
				}
				
				}catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		
		public int getStackCount() {
			return this.stackCount;
	 	}
	}







package study.thread.state;

public class StorageMain {

	public static void main(String[] args) {
		
		Storage s = new Storage();
		AddStack as = new AddStack(s);
		PopStack ps = new PopStack(s);
		
		
		as.start();
		ps.start();
		
	}
}

'교육전 개인공부' 카테고리의 다른 글

리스트로 수정해보는 로또  (1) 2023.10.29
파일 입출력  (0) 2023.10.28
정렬, 비교, 람다  (0) 2023.10.25
컬렉션 프레임워크  (2) 2023.10.23
기본 API클래스4 -Wrapper  (1) 2023.10.23
Comments