티스토리 뷰

학교공부

(학교공부) JAVA - 스레드

날따라해봐요요롷게 2021. 11. 2. 13:39

- Thread

스레드의 우선 순위

- 우선 순위가 높은 스레드는 실행의 우선권을 갖는다.

(현재 실행중인 스레드 보다 우선순위가 높은 스레드가 들어오면 우선순위가 높은 스레드에게 더 많은 실행시간 할당됨)

- setPriority() 메소드 : 우선 순위 부여

형식 : 스레드 객체명.setPriority(우선순위값);

ex) t.setPriority(10);

 

- 우선 순위를 지정하기 위한 자바의 우선순위 상수

static final int MAX_PRIORITY // 우선순위 10

static final int NORM_PRIORITY// 우선순위 5

static final int MIN_PRIORITY // 우선순위 1

 

 


스레드 - Runnable 인터페이스 활용

 

- 스레드 클래스 생성(Runnable 인터페이스를 상속한다.)

class NewThread extends Applet implements Runnable{
	public void run(){} // 오버라이딩 해야한다.
}

- 스레드 객체의 생성

NewThread r = new NewThread();
Thread thread = new Thread(r);

NewThread 객체를 생성한 후 Thread 객체 생성 시 NewThread 객체를 넣어서 객체를 생성한다.

후에 thread 객체를 사용한다.

 

이유 : 인터페이스는 상수, 추상메소드만을 갖는다.

Runnable 인터페이스를 상속받아 생성된 객체 r은 start() 메소드가 사용되지 못한다.

Runnable 인터페이스는 추상메소드로 run() 메소드만을 갖는다.

따라서 Thread에 객체를 넣어 새로운 객체를 생성해서 사용해야한다.

 

 

 

- 스레드 객체 사용

thread.start();

 

 

##동기화

 

동기화가 사용되는 경우

 : 다수의 스레드가 한 자원을 공유하는 경우, 한 자원에 대해 여러 스레드들이 동시에 접근하여 값을 수정하면 안되어서 이 공유 자원에 대해서 한 번에 하나의 스레드씩 접근을 허용하게 해야하는 경우에 사용이된다.

 

# CrItical Section (임계영역)

 : 동기화 문제에서 동시에 접근하면 안되는 구역

- 공유자원에 대해 여러 스레드가 동시에 접근하면 안되는 부분

- 자바에서는 해당 영역을 synchronized 를 적용한다.

- 한 스레드가 임계영역을 사용중이면 다른 스레드들은 접근하지 못하고 대기를 한다.

 

class Printer{		// 공유자원 클래스
	int num = 0;
	synchronized void output(String name) {	// 공유자원을 제한하는 메소드
		System.out.println(name + " pc 프린터 요청 " + num++ + " 번째");
	}
}

class Pc extends Thread{	// 공유자원을 사용하는 객체
	Printer printer;
	public Pc(Printer printer, String name) {
		super(name);
		this.printer = printer;
	}
	@Override
	public void run() {
		for(int i=0; i<3; i++) {
			printer.output(getName());
		}
	}
}

public class SyncPCThread {
	public static void main(String[] args) {
		Printer printer = new Printer();
		
		Pc p1 = new Pc(printer, "first");
		Pc p2 = new Pc(printer, "second");
		Pc p3 = new Pc(printer, "third");
		
		p1.start();
		p2.start();
		p3.start();
	}
}

동기화 프로그램 순서

- 프로그램의 스레드는 무엇인가?

- 스레드들의 공유자원은 무엇인가?

- 동기화 해야할 작업(Critical Section)은 무엇인가?

=> 스레드들이 공유자원에 대하여 동시에 실행하면 안되는 상황

- 스레드 클래스 만들기 (다중 상속이 아닌 경우 : Thread 상속 / 다중 상속인 경우 : Runnable 인터페이스 상속)

- 공유자원 클래스 만들기

- 공유자원 클래스 안에 동기화 해야 할 작업의 메소드를 만든다. (synchronized method)

- main 클래스 만들어 스레드, 공유자원 객체를 만들어 스레드를 start 한다.

 

 

 


통신

 

스레드들이 통신할 때, 순서에 따라 일하기 위해서는 ( 신호 )를 사용하며 스레드 자신의
순서가 아닐때 기다리기 위한 ( wait ) 메소드와, 일을 다하고 나갈 때 다른 스레드를 깨우기
위해서 사용하는 ( notify ) 메소드 또는 ( notifyAll ) 메소드를 사용한다.

 

synchronized : 공유자원에서 동기화 메소드를 활용하기 위한 예약어이다.

 

공유자원에서 동시에 일어 수행되지 못하는 메소드들을 sync 를 활용하여 메소드를 작성한다.

 

수행하는 주체인 스레드는 Thread 클래스를 상속받아 run() 메소드를 오버라이딩 한다.

run() 메소드에서는 직접적으로 수행하는 메소드들을 작성하며, 스레드들이 순서대로 수행하기 위해서는 수행순서를 작성하기 위해 신호를 준다. 자신의 신호에 맞지 않다면 

 

 

 

 

 

 

'학교공부' 카테고리의 다른 글

chapter - 15  (0) 2021.07.02
기말고사  (0) 2021.06.14
JSP - 1  (0) 2021.03.03
구조체, 공용체 - #1  (0) 2021.02.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함