[Java] 프로세스/스레드

hameee·2023년 10월 24일
1

Java

목록 보기
24/26
post-thumbnail

📍 프로세스 vs. 스레드

  • 프로세스(Process): 실행 중인 프로그램의 인스턴스
  • 스레드(Thread): 프로세스 내에서 실행되는 독립적인 실행 단위

이미지 출처

📍 스레드 생성 & 실행

  • Thread 클래스를 상속하는 방법: Thread 클래스 상속 + run() 오버라이드 -> 메인 클래스에서 인스턴스 생성 -> start()
  • Runnable 인터페이스를 구현하는 방법: Runnable 인터페이스 구현 + run() 오버라이드 -> 메인 클래스에서 인스턴스 생성 -> new Thread()의 전달 인자로 넘김 -> start()
run()start()
실행새 스레드는 생성되지 않으며 run() 메소드를 호출 스레드 자체에서 실행새 스레드를 생성하고 새로 생성된 스레드에서 run() 메소드를 실행
다중 호출가능불가능
정의된 곳java.lang.Runnable 인터페이스(구현체에서 오버라이드 필수)java.lang.Thread 클래스

1) Thread 클래스를 상속하는 방법

package lesson11;

public class ThreadExtends extends Thread {
	// 필드
	private String resource;
	
	// 메소드
	public ThreadExtends(String resource) {
		this.resource = resource;
	}
	
	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.print(this.resource + " ");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
package lesson11;

public class Ex01 {

	public static void main(String[] args) {
		ThreadExtends te1 = new ThreadExtends("●");
		ThreadExtends te2 = new ThreadExtends("○");
		
		// run: 스레드 생성 X, 순차적으로 실행
		te1.run();
		te2.run();
		
		System.out.println();
		
		// start: 스레드 생성 O, 동시에 실행
		te1.start();
		te2.start();
	}

}

2) Runnable 인터페이스를 구현하는 방법

package lesson11;

public class ThreadImplements implements Runnable {
	// 필드
	private String resource;

	// 생성자
	public ThreadImplements(String resource) {
		this.resource = resource;
	}

	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.print(this.resource + " ");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
package lesson11;

public class Ex02 {

	public static void main(String[] args) {
		ThreadImplements ti1 = new ThreadImplements("●");
		ThreadImplements ti2 = new ThreadImplements("○");

		Thread t1 = new Thread(ti1);
		Thread t2 = new Thread(ti2);
		
		// run: 스레드 생성 X, 순차적으로 실행
		ti1.run();
		ti2.run();

		System.out.println();

		// start: 스레드 생성 O, 동시에 실행
		t1.start();
		t2.start();
	}

}

📍 Thread 클래스 메소드

메소드명설명반환값
join()스레드가 종료될 때까지 (메소드를 호출한 스레드가) 대기
ex) thread1.join()을 호출한 스레드가 thread1이 종료될 때까지 대기
void

📍 헷갈리는 개념 정리

1) 동시성 vs. 병렬성

  • 동시성(Concurrent): 번갈아 가며 실행
  • 병렬성(Parallel): 실제로 동시에 실행

이미지 출처

2) 멀티 프로세스 vs. 멀티 스레드

  • 멀티 프로세스: 여러 독립적인 프로세스를 동시(concurrent)에 실행하는 방식
  • 멀티 스레드: 하나의 프로세스 내에서 여러 스레드를 동시(concurrent)에 실행하는 방식

이미지 출처

3) 프로세스 vs. 프로세서

  • 프로세스(Process): 프로그램 실행 방식. 프로그램 개발자가 싱글/멀티를 결정.
  • 프로세서(Processor): 보통 CPU(중앙 처리 장치)를 의미. 컴퓨터 시스템의 하드웨어 구성에 따라 싱글/멀티가 결정.

4) 멀티 프로세서 vs. 멀티 코어

알아야 할 것

  • 프로세서(CPU)는 코어를 포함한다.
  • 멀티 프로세서: 두 개 이상의 프로세서(CPU)를 가진 시스템.
  • 멀티 코어: 두 개 이상의 코어를 가진 하나의 프로세서(CPU)

아래 이미지는 멀티 프로세서, 멀티 코어를 가진 컴퓨터를 나타낸 것이다.

이미지 출처

0개의 댓글