고급자바_Thread_작성방법, 메서드

wstudee·2020년 9월 21일
0

JAVA_고급

목록 보기
6/19

process

  • 운영체제에서 현재 실행되고 있는 프로그램
  • 하나의 프로세스 안에서 여러개의 흐름이 동작할 수 있는데
    이것을 Thread라고 함

Multi Process

  • 두 개 이상의 프로세스가 실행되는 것

Multi Tasking

  • 두 개 이상의 프로세스를 실행하여 일을 처리하는 것

Thread

  • 프로그램 실행 흐름
  • 프로세스 내에서 실행되는 세부 작업 단위
  • 하나의 프로세스 내에는 여러 개의 Thread가 존재할 수 있음
  • 경량화 프로세스라고도 함
  • 두 개 이상의 Thread를 MultiThread라고 함

Thread 특징

  • 프로세스에 비해 문맥교환 시간이 적게 걸림
  • 동료 Thread와 사용메모리 공유할 수 있음
  • Thread간의 통신은 프로세스간의 통신에 비해 시간이 적게 걸림 (=빠름)
  • 프로세스에 비해 생성 및 종료 시간이 적게 걸림(=빠름)

single Thread Program

  • 기본적으로 하나의 Thread가 실행됨.
  • main Thread

Multi Thread Program

  • Thread가 2개 이상인 프로그램
  • 모든 Thread가 종료되야 프로그램이 종료됨

Thread 만들기

작성방법

방법1. Thread Class 상속

  • java.lang.Thread클래스를 상속하는 클래스 만들고,
  • Thread가 가지고 있는 run()메서드를 오버라이딩
  • Thread를 상속받았기 때문에 Thread임
    1. Thread 클래스를 상속한 class의 인스턴스 생성후
    2. 이 인스턴스의 start() 메서드 호출
// Thread클래스 상속받는 class MyThread1
class MyThread1 extends Thread{
	// run()메서드 오버라이딩
    @override
	public void run(){
    ...
    }
}

// Thread 객체 생성 
MyThread1 th = new MyThread1();
th1.start();
  • MyThread1은 Thread를 상속받았기 때문에 Thread 임

방법2. Runnable 구현한 Class

  • Runnable 인터페이스 구현
  • Runnable 인터페이스가 가지고 있는 run()메서드 오버라이딩
  • java는 단일상속이 원칙이라 이미 다른 클래스를 상속받고 있을 때
    Thread 클래스 상속받을 수 없음 => Runnable interface 구현
  • Thread 를 상속받지 않았기 때문에 바로 start() 메서드 호출할 수 없음
    1. Runnable 인터페이스 구현한 class의 인스턴스를 생성하고
    2. 이 인스턴스를
    3. Thread 객체의 인스턴스를 생성할 때 생성자의 매개변수로 넘겨줌
    4. Thread 객체 인스턴스의 start() 메서드 호출
class MyThread2 implements Runnable{
	public void run() {
    ...
    }
}

MyThread2 run = new MyThread2();
Thread th2 = new Thread(run);
th2.start();

방법 3. 익명 Class

  • 별도의 클래스 만들지 않고
  • Runnable 인터페이스를 구현한 익명클래스를
  • Thread 인스턴스 생성할 때 매개변수로 넘겨줌
  • 매번 정의해야되는게 단점이지만
  • 한번만 쓰고 말거라면 굳이 클래스 만들 필요없이 할 수 있음
Thread th3 = new Thread(new Runnable() {
	@override
    public void run(){
    ...
    }
});
th3.start();

Thread 상태

  • NEW : 스레드가 생성되고 아직 start()가 호출되지 않은 상태
  • RUNNABLE : 실행 중 또는 실행 가능한 상태
  • BLOCKED : 동기화 블럭에 의해 일시정지된 상태
    (lock이 풀릴 때까지 기다리는 상태)
  • WAITING : 일시정지 상태 (UNRUNNABLE)
    TIMED_WAITING : 일시정지 시간이 지정된 경우
  • TERMINATED : 스레드의 작업이 종료된 상태
  • getState() 스레드의 상태 반환
Thread.State state = targerThread.getState();
// State : Thread클래스의 enum 상수 

우선순위

  • 어떤 Thread를 우선적으로 처리할지 우선순위 부여
  • setPriority(1 ~ 10) : 숫자 클수록 우선순위 높음
  • start() 메서드 호출하기 전에 설정
  • Thread 클래스의 상수 사용 가능
    Thread.MAX_PRIORITY : 최대 우선순위 = 10
    Thread.MIN_PRIORITY : 최소 우선순위 = 1
    Thread.NORM_PRIORITY : 보통 우선순위 = 5
Thread th = new Thread();

th.setPriority(10);
th.start();

Threae 클래스 상수 사용하는 경우 
th.setPriority(Thread.MAX_PRIORITY);
th.start();

Daemon Thread

  • 일반스레드의 작업을 돕는 보조적인 역할 수행
  • 일반스레드가 모두 종료되면 데몬스레드는 자동 종료

작성방법

  • start()메서드 호출 전에 설정
  • 스레드객체.setDaemon(true);
  • ex. 3초마다 자동 저장하는 스레드

0개의 댓글