쓰레드의 기본적 구현과 실행

2022. 2. 14. 14:57·자바/프로세스와 쓰레드

1. 쓰레드의 구현 방식

- 쓰레드 구현의 방식은 두 가지가 있는데, Thread 클래스를 상속받는 방법과 Runnable 인터페이스를

구현하는 방법이 있다.

( 어느 쪽이든 별 차이는 없지만 Thread를 상속받는다면 다른 클래스를 상속 못 받기 때문에, 인터페이스로

구현하는 것이 일반적이다. )

( 인터페이스 구현은 재사용이 높고 일관성을 유지하기에 객체지향적 방법이라고 말할 수 있다. )

 

 

 

 

1-1. 쓰레드 구현을 이해하기 위한 예제(1)

: 상속을 받는 것과 인터페이스를 구현하는 방법을 알아보는 예제이다.

 

import java.util.*;

public class Exercise001 {
	public static void main(String[] args) {
		ThreadEx1 t1 = new ThreadEx1();
		
		Runnable r1 = new ThreadEx2();
		Thread t2 = new Thread(r1);
		//= Thread t2 = new Thread(new ThreadEx2);
		
		t1.setName("Thread 쓰레드");
		t1.start();
		
		t2.setName("Runnable 쓰레드");
		t2.start();
	}
}

class ThreadEx1 extends Thread{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println(getName());
		}
	}
}

class ThreadEx2 implements Runnable{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println(Thread.currentThread().getName());
			//Thread t = Thread.currentThread();
			//println(t.getName()); 
		}
	}
}

 

( run()을 실행해야 돌아갈 거 같은 쓰레드는 run()을 호출하지 않고, start()을 통해 실행해야 돌아간다. )

( 또한 start()가 실행되었다고 무조건 실행되지 않는다. 그 이유는 앞에 쓰레드가 있었다면 대기상태로 대기

해야하기 때문이다. )

 

( 한 가지 알아두어야 할 점은 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다. )

( 그래서 한 번 실행된 인스턴스를 다시 new 를 통해서 다시 생성 후 실행시킨다. 만약 이것을 어긴다면,

IllegalThreadStateException이 발생한다. )

 

 

 

 

2. start()와 run()

- start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한다.

 

- run()은 start()가 만들어준 호출스택에서 첫 번째로 올라가게 한다.

 

- 아래는 start()와 run() 수행 시, 일어는 과정을 설명한다.

( (4)번에서는 최종적으로 쓰레드를 생성한 상태이며, 스케줄러가 정한 순서에 의해서

번갈아 가면서 실행한다. )

 

( 또한 위의 호출스택은 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다. )

 

( 만약 main 스택에서 run()을 호출한다면, 새로운 쓰레드가 생성되지 않고 바로 main 스택에

올라오게 된다. )

'자바 > 프로세스와 쓰레드' 카테고리의 다른 글

쓰레드의 실행제어  (0) 2022.02.20
데몬 쓰레드  (0) 2022.02.14
쓰레드의 우선순위와 쓰레드 그룹  (0) 2022.02.14
싱글쓰레드와 멀티쓰레드  (0) 2022.02.14
프로세스와 쓰레드의 전반적인 개념  (0) 2022.02.14
'자바/프로세스와 쓰레드' 카테고리의 다른 글
  • 데몬 쓰레드
  • 쓰레드의 우선순위와 쓰레드 그룹
  • 싱글쓰레드와 멀티쓰레드
  • 프로세스와 쓰레드의 전반적인 개념
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      소켓 프로그래밍
      java.time 패키지
      Collections Framework
      알고스팟
      outputstream
      serializable
      중간연산
      불안정 정렬
      TCP 소켓 프로그래밍
      Arrays
      역직렬화
      snail
      유용한 클래스
      스트림
      InputStream
      안드로이드 스튜디오
      제자리 정렬
      람다식
      선택 정렬
      map()
      코딩테스트
      java.lang패키지
      file
      ServerSocket
      문자 기반 스트림
      안정 정렬
      자바 개념
      다형성
      코딩트리조별과제
      코드트리
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    쓰레드의 기본적 구현과 실행
    상단으로

    티스토리툴바