[CS]Thread : 스레드

김피자·2023년 1월 27일
0

CS

목록 보기
5/22
  • 동기 : 어떤 요청을 보낸 뒤, 그 요청의 결과값을 얻기까지 작업을 멈춤
  • 비동기 : 어떤 요청을 보낸 뒤, 그 요청의 결과값을 얻기까지 멈추지 않고 다른 일을 수행하는 것

Process : 프로세스

: 보조기억장치의 프로그램이 메모리 상으로 적재되어 실행되면 프로세스
: 프로세스별로 Code, Data, Stack, Heap Memory영역을 가지며 하나의 CPU를 점유하여 수행하게 된다.

즉, 프로세스란 현재 실행중인 프로그램을 의미 (완전히 독립적인 수행단위)

Thread : 스레드

: 같은 Process 내에서 실행되는 여러 작업(흐름)의 단위
: 한 프로그램에 여러개의 스레드가 존재할 수 있다.
	(스레드가 1개면 단일, 2개 이상이면 다중 스레드)
: 프로그램 코드를 한 줄씩 실행하는 것이 스레드의 역할(= 실행제어)
: 스레드란 곧 프로그램을 실행하는 주체


스레드는 공통적으로는 code, data, heap data를 공유하고,
각 스레드간에는 독립적인 register, stack 정보들을 관리

! 각 스레드는 다른 스레드에게 스택 메모리를 공유할 수 없음
!! 하지만, 프로세스의 힙은 속한 모든 스레드가 공유할 수 있음
!!! 프로세스 밖에서 스레드를 각각 제어할 수 없음
!!!! 잘못된 변수를 스레드간 공유해 오류가 발생할 수 있음

Multi Thread : 멀티스레드 (다중스레드)

: 여러개의 스레드를 이용하는 프로그램
: 각각의 스레드는 하나의 독립적인 프로세스처럼 작업 수행

멀티 스레드로 구현된 프로그램을 실행하면

  • 하나의 프로세서는 한번에 스레드 1개밖에 실행하지 못함
  • 대신 일정한 시간 간격으로 수행해야하는 스레드를 전환함
  • 스레드를 전환할 때는 운영체제의 스케줄러의 기준에 따라 순서가 정해짐
  • 여러 스레드를 번갈아 처리하기 때문에 정확히 말하면 한번에 한가지만 처리하지만 동시에 작업하는 듯한 효과를 줌
  • 이같은 방식을 시분할 방식 이라고 함

멀티 스레드 방식의 장점

프로세스는 독립적임 > 프로세스끼리 자원 및 데이터를 공유하기 어려움
: 프로세스간 데이터 전송이 필요한 경우 시간과 자원의 소모가 많다.

하지만, 프로그램 내의 스레드는 서로 독립적이지 않음

스레드는 작업 공간을 같이 사용하기 때문에 자원 및 데이터를 공유할 수 있음
: 스레드간 데이터 전송이 필요한 경우 시간, 자원 소모가 적음

스레드는 프로세스처럼 작업을 동시에 처리할 수 있는 공통적인 특징을 가지면서, 프로세스보다 오버헤드가 적다는 것이 장점

멀티 스레드 적용하기위한 조건

1. 병행성 : 다수의 스레드 생성방법 존재
2. 동기화 : 작업이 방해받지 않고 각 스레드의 동기화 방법 존재
3. 통신 : 서로 다른 스레드가 정보를 교환할 수 있는 방법 존재

스레드는 동시성 프로그래밍을 위한 기술

스레드는 각 태스크에 해당하는 스택 메모리를 할당받음
그리고 여러 작업을 동시에 수행할 일이 생기면 OS는 어떤 스레드 작업을 먼저 수행할지, 어떤 스레드를 더 많이 수행해야 효율적인지 스케쥴링(선점 스케줄링)을 해야함

Thread의 동시성 보장 수단 : Context Switching

  • 운영체제 커널에 의한 Context Switching을 통해 동시성 보장
  • 블로킹(Blocking) : Thread A가 Thread B 결과가 나오기까지 기다려야한다면, Thread A는 블로킹되어 Thread B의 결과가 나오기 전 까지 해당 자원을 못 씀

스레드 생성하기

생성자내용
Thread()일반적 스레드 객체 생성
Thread(Runnable target)run메소드를 가지는 객체를 인자값으로 할당
Thread(Runnable target, String name)run매소드를 가지는 객체와 스레드 이름을 인자값으로 할당
Thread(String name)스레드 생성하며 스레드 이름 지어주기
  • Thread 클래스를 상속받아 thread 생성
public class Test extends Thread{
	@Override
    public void run(){
    	/*스레드 실행 코드*/
    }
}
  • Runnable 인터페이스 구현해 thread 생성
public class Test implements Runnable{
	@Override
    public void run(){
    	/*스레드 실행 코드*/
    }
}
  • 스레드 5개 생성하는 멀티 스레드 예제
  1. 스레드 상속받아 1개 생성
public class FirstThread extends Thread{
	@Override
    public void run(){
    	System.out.println("1");
    }
}
  1. Runnable 구현하여 1개 생성
public class SecondThread implements Runnable{
	@Override
    public void run(){
    	System.out.println("2");
    }
}
  1. 외부 클래스로 스레드 2개, 내부 클래스로 스레드 2개, 익명구현 객체로 1개 생성
public class Test {
	//내부 클래스 - Thread 상속받기
    class ThirdThread extends Thread{
        @Override
        public void run() {
            System.out.println("3");
        }
    }

	//내부 클래스 - Runnable 구현
    class fourthThread implements Runnable{
        @Override
        public void run() {
            System.out.println("4");
        }
    }

//메인함수
    public static void main(String[] args) {
        Test t = new Test();        
        
        //스레드1
        FirstThread th1 = new FirstThread();
        th1.start();

        //스레드2
        SecondThread sec_thread = new SecondThread();
        Thread th2 = new Thread(sec_thread);
        th2.start();

        //스레드3
        ThirdThread th3 = t.new ThirdThread();
        th3.start();

        //스레드4
        Thread th4 = new Thread(t.new fourthThread());
        th4.start();
//        new Thread(t.new fourthThread()).start();

        /*
        스레드5 - 익명 객체구현객체 방식으로 생성
        	Thread 생성시 인자값으로 Runnable을 구현하는 코드 삽입하기
        */
        Thread th5 = new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("5");
                    }
                }
        );
        th5.start();
    }
}

결과

위 실행코드 결과는 다 랜덤이다 왜냐면 실행할 때마다 결과가 다르니깐
왜냐면 스레드 실행하는데 우선순위가 정해져 있지 않기 때문임

출처
https://makecodework.tistory.com/entry/Java-%EC%8A%A4%EB%A0%88%EB%93%9CThread-%EC%8A%A4%EB%A0%88%EB%93%9C-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0
https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0

profile
제로부터시작하는코딩생활

0개의 댓글