Java Thread?

Chunbae·2024년 12월 11일
0

Java

목록 보기
5/11

Thread??

thread는 프로세스내에서 실질적인 작업을 실행하는 단위이며, 자바에서는 JVM의해 관리됩니다.
프로세스에는 최소 한개이상의 thread가 존재하며, Main thread하나로 시작하여 추가 생성이 진행되면서 멀티 스레드 환경이 됩니다.

Process?
프로세스(process)는 일반적으로 CPU에 의해 자원 할당을 받아 실행중인 프로그램을 말하며, 자신만의 메모리 공간을 포함한 독립적인실행 환경을 갖고 있습니다.

JVM?
Java Virtual Machine의 줄임말이며, JVM은 OS에 종속 되지 않고 CPU가 JAVA를 인식하여 실행할 수 있게끔 하는 가상환경입니다.

Java Thread?

Java에서 스레드 작업을 실행하기 위한 "실행 단위"입니다. 기본적으로 Java에서는 싱글 스레드로 시작하여 main메서드에서 Main스레드가 동작합니다.
Java는 멀티 스레드를 지원하여 하나의 프로세스 안에 한개 이상의 스레드를 지원하는 구조를 가질 수 있습니다.

각 영역을 살펴보자면 다음과 같습니다.

Code

  • 프로그램의 코드가 저장되는 영역입니다.
  • 같은 코드의 영역을 공유하며 해당 영역은 읽기전용입니다. 따라서 영역에 따른 동기화는 진행하지 않습니다.

Data

  • 전역변수와 정적변수가 저장되는 영역입니다.
  • 해당 영역은 프로그램이 종료될 때까지 메모리에 존재하는 데이터를 의미합니다.
  • Thread는 같은 영역의 데이터를 공유하며 읽기전용입니다. code영역과 동일하게 동기화는 진행하지 않습니다.

Heap

-동적 할당된 메모리가 저장되는 영역입니다.

  • Thread간 Heap영역을 공유하며 멀티 스레드 환경에서 동기화 문제가 발생할 수 있기 때문에 적절한 동기화를 진행해야 합니다.

Stack

  • 함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역입니다.
  • 함수의 호출이 종료되면 메모리에서 해제됩니다.
  • Stack은 Thread마다 독립적으로 존재하기 때문에 공유와 동기화를 진행하지 않습니다.




Single Thread & Multi Thread

Single Thread

하나의 프로세스 내에서 하나의 스레드만을 사용하여 실행되는 환경을 말합니다. 싱글 스레드는 순차적으로 작업을 처리하며 현재 처리중인 작업이 종료되기 전까지 다음 작업을 실행하지 않습니다.

하나의 task만 처리할 수 있어 처리량이 낮아지는 단점이 존재합니다.


Multi Thread

하나의 프로세스 내에서 하나 이상의 스레드가 실행되는 환경을 말합니다. 멀티스레드는 병행실행을 통해 동시에 여러 작업을 수행하므로 작업의 효율이 높습니다.

동시에 여러 작업을 수행하기 때문에 스레드간 동기화 문제가 있을 수 있습니다.



싱글스레드와 멀티 스레드의 비교

구분단일 스레드 (Single Thread)멀티 스레드 (Multi Thread)
처리 속도느림빠름
성능낮음높음
CPU 활용낮음높음
병목현상발생완화
안정성높음낮음
디버깅쉬움어려움
코딩간단복잡
확장성낮음높음
효율성낮음높음
예측성높음낮음
비용낮음높음

Thread 관련 메서드

메서드설명
start()스레드를 시작한다
run()작업을 정의한다
sleep(long millis)현재 스레드를 시간만큼 중지
yield()실행 스레드 변경
join()다른 스레드 종료될 때까지 현재 스레드 일시 정지
isAlive()실행 여부 확인
setName(String str)이름 지정
getName()이름 반환
setPriority()우선순위 지정
getPriority()우선순위 반환
interrupt()작업 중단

Thread관련 Object 메서드

  • wati() : 현재 스레드를 일시중시하고 다른 스레드가 notify()또는 notifyAll() 메서드 호출전까지 대기상태로 변경합니다.
  • notify() : wati()의해 중지된 스레드 중 하나를 실행대기 상태로 변경합니다.
  • notifyAll() : wati()의해 중지된 모든 스레드를 실행대기 상태로 변경합니다.


Thread 생성

자바에서 스레드를 생성하는 방법은 크게 두가지로 분류됩니다.

  • Thread Class 상속
public MyThread extends Tread{
	@override
	public void run(){
		System.out.println("스레드를 시작합니다")
	}
}

public class main{
	public static void main(String[] agrs) {
		MyThread thr = new MyThread();
		
		thr.start(); //스레드 시작
	}
}

  • Runnable interface 구현
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("스레드를 시작합니다")
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        thread1.start(); // 스레드 시작
    }
}

Thread 클래스 내부를 살펴보면 Thread는 Runnable을 구현하고 있는 것을 확인 할 수 있습니다.


멀티스레드 구현

public class MultiThread extends Thread{
	int seq; //시퀀스 정의
	
	public MultiThread(int seq){
		this.seq = seq;
	}
	
	@Override
	public void run(){
		System.out.println(seq + "번째 스레드 실행");
		
		try{
			Thread.sleep(10000);
		}catch (InterruptedException e) {
			throw new RuntimeException(e);
		}
		
		System.out.println(seq + "번째 스레드 종료");
	}
	

public class main {
	
	public static void main(String[] args){
		for(int i = 1; i<= 10; i++){
			MultiThread thread = new MulitThread(i);
			//스레드 시작
			thread.start();
		}
		
		System.out.println("메인 스레드 종료");
	}
}

profile
말하는 감자

0개의 댓글