[기본 개념]

 

프로세스(process) : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 것

스레드(thread) : 프로세스 내부에서 코드의 실행 흐름을 의미함.


스레드

 

https://gosmcom.tistory.com/19

 

  • 멀티 프로세스(multi process) : 자신의 메모리를 가지고 실행하므로 서로 독립적이지만, 멀티 스레드는 하나의 프로세스 내부에 생성되므로 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받는다. 따라서 멀티 스레드는 예외처리를 잘 해줘야 한다.
  • 멀티 스레드(multi thread) : 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우
  • 스레드(thread) : 사전적 의미로 한 가닥의 실이라는 뜻. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어놓았다고 해서 유래된 이름
  • 멀티 스레드의 사용 
    • 대용량 데이터 처리 시간을  줄이기 위해 데이터를 분할해서 병렬로 처리
    • UI를 가지고 잇는 애플리케이션에서 네트워크 통신을 하기 위해 사용
    • 다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용

 

메인 스레드

 

https://azderica.github.io/10-java-study/

 

  • 자바의 모든 애플리케이션은 메인 스래드가 main() 메소드를 실행하면서 시작된다.
  • 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
  • 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.

 

작업 스레드 생성과 실행

  • 멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성한다.
  • 모든 애플리케이션은 메인 스레드가 반드시 존재하기 때문에, 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생서하면 된다.
  • 자바에서는 작업 스래드도 객체로 생성되기 때문에 클래스가 필요하다.

< 클래스 생성하는 방법 >

 

① Thread 클래스로부터 직접 생성

  • java.lang.Tread 클래스로부터 작업 스래드 객체를 직접 생성하려면 다음과 같이 Runnable을 매개값으로 갖는 생성자를 호출한다.
  • Thread thread = new Thread(Runnable target);
  • 다음과 같이 Runnable 구현 클래스를 작성한다.
Thread thread = new Thread(new Runnable) {
	public void run(){
    
    	스래드가 실행할 코드; //익명 구현 객체
    
    }
}
  • 위와 같이 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있다.
  • 작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start() 메소드를 호출해야만 실행이 된다.
  • thread.start();

 

https://gosmcom.tistory.com/20

② Thread 하위 클래스로부터 생성

  • 작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시키는 방법
  • Thread 클래스를 상속한 후 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성한다.
public class WorkerThread extends Thread {
	@Override
	public void run(){
    
    	스래드가 실행할 코드; //run 메소드 재정의
    
    }
}
Thread thread = new WorkerThread();
  • 코드를 더 절약하기 위해 다음과 같이 Thread 익명 객체로 작업 스레드 객체를 생성할 수도 있다.
Thread thread = new Thread(){
	public void run(){
    
    스레드가 실행할 코드; //익명 자식 객체
    
    }
};

 

③ 스레드의 이름

  • 스레드는 자신의 이름을 가지고 있다. 
  • 스레드의 이름이 큰 역할을 하는 것은 아니지만, 디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용된다.
  • 스레드 이름 설정 : thread.setName("스레드 이름");
  • 스레드 이름 조회 : thraea.getName();

 

동기화 메소드

① 공유 객체를 사용할 때의 주의할 점

  • 멀티 스레드 프로그램에서 스레드들이 객체를 공유해서 작업해야 하는 경우
  • 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있기 때문에 주의해야 한다.

② 동기화 메소드

  • 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 하려면 스레드 작업이 끝날 때 까지 객체에 잠금을 걸어 다른 스레드가 사용할 수 없도록 해야 한다.
  • 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 한다.
  • 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드를 제공한다.
  • 동기화 선언을 하는 방법 : 메소드 선언에 synchronized 키워드를 붙인다.

 

 

'Coding > Java' 카테고리의 다른 글

[30] JAVA 컬렉션 프레임워크  (0) 2022.12.25
[29] JAVA 스레드 제어  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09

+ Recent posts