자바의 정석 12장 (32일차) - 스레드

728x90

멀티스레드

스레드란 한개의 프로세스에서 작동되는 실행 작동 장치이다.

즉, 멀티스레드의 의미는 한개의 프로세스에서 여러가지 작업을 하는 실행 작동 장치이다.

 

멀티스레드를 쓰는 것이 여러모로 좋지만, 아래의 사항에 주의해야한다.

  • 동기화를 주의해야한다. 
  • 각 스레드가 효율적으로 고르게 실행되게 작성해야한다.

스레드의 구현과 실행

두가지의 방법을 사용할 수 있다.

  • Thread 클래스를 상속
  • Runnable 인터페이스를 구현

Thread는 extends를 사용하여 클래스를 상속받고, Runnable의 경우에는 implements를 사용하여 Runnable 인터페이스를 상속받는다.

public class ThreadRunnable{
	public static void main(String[] args) {
		Nthread t = new Nthread();
//		Thread의 경우에는 클래스 이름을 자료형으로 선언하고
		
		Runnable r = new Rthread();
		Thread t2 = new Thread(r);
//		Runnable인 경우에는 먼저 클래스의 주소값을 Runnable클래스에 할당하고
//		Thread클래스에 주소값을 담는다. 
	}
}

class Nthread extends Thread{
	public void run() {
		for(int i = 0; i<100; i++) {
			System.out.print("/");
		}
	}
}

class Rthread implements Runnable{
	public void run() {
		for(int i = 0; i<100; i++) {
			System.out.print("-");
		}
	}
}

스레드의 우선순위

스레드는 기본적으로 OS스케줄러에 의해 우선순위가 결정되는데, 우리가 JVM을 통해 우선권을 할당해줄 수 있다. 

  • JVM을 통해 1 부터 10까지 할당이 가능하고 setPriority 메서드를 통해 할당이 가능하다.
  • 단, 할당해주지 않아도 자동으로 5로 설정되어있다.

주의할 점: 우선권을 높여준다고 하더라도, 기본적으로 OS스케줄러에 의존하고 있기 떄문에 우선권이 높은 스레드가 먼저 끝날 확률이 높은 것뿐이지 절대로 먼저 끝난다고 확언할 수 없다.

	public static void main(String[] args) {
		highthread t = new highthread();
		
		Runnable r = new lowthread();
		Thread t2 = new Thread(r);
		
		System.out.println("기본 Priority: " + t.getPriority());
		t.setPriority(9);
		System.out.println("세팅된 Priority: (ㅡ)" + t.getPriority());

		
		t.start();
		t2.start();
//		1-10까지 정해줄 수 있지만 OS스케줄러가 권환을 줄 수 있기 때문에 항상 먼저 끝나는 것은 아니다.
		 
	}
}

class highthread extends Thread{
	public void run() {
		for(int i = 0; i<100; i++) {
			System.out.print("ㅡ");
		}
	}
}

class lowthread implements Runnable{
	public void run() {
		for(int i = 0; i<100; i++) {
			System.out.print("|");
		}
	}
}

스레드 그룹 & 메서드

모든 스레드는 반드시 하나의 그룹에 속해있어야 하는데, 그룹을 지정하지 않을 경우 main그룹에 속해있다.

자신을 생성한 그룹의 우선순위(기본 우선순위: 5)를 상속받는다

728x90