Java10 Thread (쓰레드란?)

차차·2021년 7월 26일
0

Java

목록 보기
10/11

Thread란?

어떠한 프로그램내에서 특히 프로세스 내에서 실행되는 흐름의 단위.

프로그램 : 보통 우리가 만드는 프로그래밍 언어로 소스를 짜서 만든 것

프로세스 : 이 프로그램을 "실행"시켜서 동작하게 만들면 프로세스

이 프로세스는 보통 하나의 루틴(프로그램 처리 경로)을 가지고 있다. 이 루틴은 직렬적이다. 즉 어떠한 일을 수행하는 것에 있어 프로그래머가 원하는 순서대로 일을 처리한다. 그러나 순서가 필요없는 일들이 있을 때 "동시에" 처리하고 싶을때가 있다. 이때 사용하는것이 스레드이다.

Thread 생성

2가지 방법이 있다.

① 직접 상속 받아 스레드 생성

② Runnable 인터페이스를 구현해서 생성

직접 Thread를 상속 받는 스레드

class MyThread02 extends Thread { //기능 여러개가 필요할때 
	
	public void run() {
		for(int i=0;i<10;i++) {
			System.out.println(i);
		}
	}	
}
public class Thread02 {
	
	public static void main(String[] args) {
		MyThread02 my01 = new MyThread02();
		MyThread02 my02 = new MyThread02();
		
		//start() -> run() 을 자동 호출한다. 
		my01.start();
		my02.start();
	}
}

Runnable 인터페이스를 구현하는 스레드

class MyThread01 implements Runnable{ //간단하게 실행할 때

	@Override  //Runnable 인터페이스의 run()을 오버라이딩하는 것 (꼭 해야함)
	public void run() { 
		
			for(int i=0; i<10; i++) {
				System.out.println("i : "+i);			
		}		
	}	
}
public class Thread01 {

	//main thread 이다,우선 순위가 높기 때문에 먼저 실행된다.(main:우선순위 5)  
	public static void main(String[] args) {
		System.out.println("main start ----------------------");
		
		
		//Thread이다 >> 실행 흐름이 my01,my02,main 세개가 만들어지는것 
		Thread my01 = new Thread(new MyThread01()); //러너블 상속이기 떄문에 쓰레드로 만들어 줘야함 
		Thread my02 = new Thread(new MyThread01());
		
		my01.start();
		my02.start();
		System.out.println("main stop------------------------");
	}
	
}

자바의 스레드 스케줄링

2개 이상의 스레드가 동작 중일 때 우선순위를 부여하여 우선 순위가 높은 스레드에게 실행의 우선권을 부여할 수 있다.

멀티 스레드는 동시성 또는 병렬성으로 실행된다.

동시성: 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질

병렬성: 멀티 작업을 위해 멀티 코어에게 개별 스레드를 동시에 실행하는 성질

이때 스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정해야 하는데 이것을 스레드 스케줄링이라고 한다. 스레드들은 아주 짧은 시간에 번갈아 가면서 그들의 run() 메소드를 조금씩 실행한다.

자바의 스레드 스케줄링은 우선순위(Priority) 방식과 순환 할당 (Round-Robin) 방식을 사용한다.

Thread 우선순위

스레드를 생성하면 기본적으로 우선순위는 5로 설정되어있다. 어떤 스레드가 5보다 큰 우선순위를 가진다면 시스템은 이를 우선하여 CPU를 스케줄링해준다.

class MyThread03 extends Thread{
	
	public MyThread03(String name) {
		super(name);		
	}
	@Override
	public void run() {
		for(int i =0;i<10;i++) {
			System.out.println(this.getName()+":"+i);
		}
		System.out.println(this.getName()+" 끝 ! ");	
	}	
}
public class Thread03 {

	public static void main(String[] args) {
		MyThread03 dog = new MyThread03("멍멍");
		MyThread03 cat = new MyThread03("야옹");
		
		*우선순위 설정 방법) 1~10 사이의 숫자를 넣을 수 있다. 
		dog.setPriority(10); //maximim priority 우선순위가 가장 높다 
		cat.setPriority(Thread.MIN_PRIORITY); // 우선순위가 가장 낮다 
    // but 우선순위 상관없이 돌아가면서 끝난다.  
		
		dog.start();
		cat.start();		
	}
}

Thread -join메서드

스레드는 다른 스레드와 독립적으로 실행되는 것이 일반적이지만, 다른 스레드가 종료될 때까지 기다리다가 실행하고싶은 경우가 발생할 수 있다.

그때 join메서드를 사용하여 아래와 같은 코드를 사용할 수 있다.

public static void main(String[] args) {
		MyThread03 m1 = new MyThread03("야옹");
		MyThread03 m2 = new MyThread03("멍멍");
		
		m1.start();
		
		try {
			//join 해당 thread 가 종료될때까지 다른 thread를 멈춘다.  
			m1.join();
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
		m2.start();
profile
개발하는 돌멩이🙄🙄👻

0개의 댓글