본문 바로가기
IT/Java

Thread란? (process비교)

by 성준하이 2023. 2. 21.
반응형

먼저 thread 에 알기 전보다 알아야할 것이 있다.

그는 바로 프로세스라는것이고 

프로세스와 thread 에 차이를 알아본다.

 

프로세스(process)란?

프로세스(process)란 단순히 실행 중인 프로그램(program)이라고 할 수 있다.

즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.

이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.


스레드(thread)란?

스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미한다.

모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.

또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.

 

thread를 생성하는 법은 다음과 같다.

스레드의 생성과 실행

자바에서 스레드를 생성하는 방법에는 다음과 같이 두 가지 방법이 있다.

1. Runnable 인터페이스를 구현하는 방법

2. Thread 클래스를 상속받는 방법

 

두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메소드에 작성하면 된다.

 

스레드의 우선순위

자바에서 각 스레드는 우선순위(priority)에 관한 자신만의 필드를 가지고 있다.

이러한 우선순위에 따라 특정 스레드가 더 많은 시간 동안 작업을 할 수 있도록 설정할 수 있다.

필드설명

static int MAX_PRIORITY 스레드가 가질 수 있는 최대 우선순위를 명시함.
static int MIN_PRIORITY 스레드가 가질 수 있는 최소 우선순위를 명시함.
static int NORM_PRIORITY 스레드가 생성될 때 가지는 기본 우선순위를 명시함.

 

getPriority()와 setPriority() 메소드를 통해 스레드의 우선순위를 반환하거나 변경할 수 있다.

스레드의 우선순위가 가질 수 있는 범위는 1부터 10까지이며, 숫자가 높을수록 우선순위 또한 높아진다.

 

하지만 스레드의 우선순위는 비례적인 절댓값이 아닌 어디까지나 상대적인 값일 뿐이다.

우선순위가 10인 스레드가 우선순위가 1인 스레드보다 10배 더 빨리 수행되는 것이 아니다.

단지 우선순위가 10인 스레드는 우선순위가 1인 스레드보다 좀 더 많이 실행 큐에 포함되어, 좀 더 많은 작업 시간을 할당받을 뿐이다.

 

그리고 스레드의 우선순위는 해당 스레드를 생성한 스레드의 우선순위를 상속받게 된다.

 

 

쓰레드를 구현하는 방법은 두가지가 있다.

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

Runnable 사용을 추천한다. (Thread클래스를 상속받으면 다른 클래스를 상속받지 못하기 때문에)

Runnable을 구현하는 방법은 재사용성이 높고 코드의 일관성을 유지 할 수 있다는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있다.

 

2.1. Thread 클래스

public class ThreadExam01 {   public static void main(String[] args){       MyThread01 m1 = new MyThread01("*");       MyThread01 m2 = new MyThread01("+");       MyThread01 m3 = new MyThread01("#");       m1.start();       m2.start();       m3.start();       System.out.println("main메소드 종료.");  }}​class MyThread01 extends Thread{   private String str;   public MyThread01(String str){       this.str = str;  }​   @Override   public void run() {       for(int i = 0; i < 5; i++)           System.out.print(str);  }}​

 

2.2. Runnable 인터페이스

public class ThreadExam02 {   public static void main(String[] args){       Runnable r1 = new MyThread02("*");       Runnable r2 = new MyThread02("%");       Runnable r3 = new MyThread02("#");              //Thread t1 = new Thread(new MyThread02("*"));       Thread t1 = new Thread(r1);       Thread t2 = new Thread(r2);       Thread t3 = new Thread(r3);       t1.start();       t2.start();       t3.start();       System.out.println("main메소드 종료.");  }}​class MyThread02 implements Runnable{   private String str;   public MyThread02(String str){       this.str = str;  }​   @Override   public void run() {       for(int i = 0; i < 5; i++)           System.out.print(str);  }}
[실행결과]*****#####+++++main메소드 종료.

일단 둘 다 공통적으로 사용하기 위해서는

  • run() 메소드를 상속받아서 오버라이딩 해줘야한다.
  • 쓰레드 작업을 해줄 곳에 start()를 호출해준다.
  • start()를 호출하면 thread를 실행 준비 -> run()을 실행한다.(템플릿 메서드 패턴 적용, 오버라이딩한 메소드 사용)
 
반응형

댓글