JAVAPROGRAMING 8

정대기·2022년 7월 5일
0

JAVA PROGRAMING

목록 보기
12/15
  • 멀티 태스킹
    1. 프로세스란 운영체제에서 실행중인 하나의 프로그램
    2. 멀티 프로세스란 두 개 이상의 프로세스가 실행되는것
    3. 멀티 태스킹이랑 두 개 이상의 프로세스를 실행하여 일 처리하는것
  • 멀티 스레드
    1. 스레드란 프로세스 내에서 실행되는 세부 작업 단위
    2. 멀티 스레드란 하나의 프로세스에서 여러 개의 스레드가 병행적으로 처리

스레드의 상태

  • 스레드는 Tread 객체가 생성되면 생명주기를 갖게 되는데 크게 5가지가 있다.
  1. New - 스레드가 만들어진 상태
  2. Runnable - 스레드 객체가 생성된 후에 start() 메소드를 호출하면 Runable 상태가 된다.
  3. Running - Runnable 상태에서 스레드 스케줄러에 의해 Running 상태로 이동하게 된다.
  4. Blocked - 스레드가 다른 특정한 이유로 Running 상태에서 Blocked 상태로 이동하게 된다.
  5. Dead - 스레드가 종료되면 그 스레드는 다시 시작할 수 없게 된다.
  • 스레드의 생명주기

스레드의 생성과 실행

  • 스레드의 생성방법
    1. Tread 클래스를 상속 받는 방법
    2. Runnable 인터페이스를 구현하는 방법
  • Tread 클래스의 주요 생성자
  1. Thread() 가장 일반적인 형태의 생성자다. 이생성자를 이용해서 Tread 객체를 생성하면 Tread 의 이름은 Tread- +n 의 형태가 된다.
  2. Thread(Runnable target) Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자.
  3. Thread(Runnable target, String name) Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자며, 스레드의 이름을 지정할 수 있다.
  4. Thread(String name) 스레드의 이름을 지정하면서 Thread 객체를 생성할 수 있는 생성자다.
  • Thread 클래스의 주요 메서드
  • Thread 클래스를 이용한 스레드 생성 방법
public class CreateThread extends Thread{
public void run(){ }
public static void main(String[] args){
CreateThread ct = new CreateThread();
ct.start();
	}
}

두 스레드 생성방법은 Thread 클래스를 상속 받느냐, Runnable 인터페이스의 run 메소드를 오버라이딩 하느냐의 차이가 있지만 대부분 Runnable 인터페이스를 오버라이딩한다.
( 자바는 다중 상속지원X -> 다른 클래스를 상속받기 위해 )

  • Runnable 인터페이스를 이용한 스레드 생성 방법
 public class
 CreateRunnable implements Runnable{
 public void run(){ }
   public static void main(String[] args {
     CreateRunnable ct = new CreateRunnable();
     Thread t = new Thread(ct);
     t.start();
     }
 }

join 메서드

다른 스레드의 종료를 기다리는 메서드
스레드는 다른 스레드와 독립적으로 실행되는 것이 일반적이지만, 다른 스레드가 종료될 때까지 기다리다가 실행되야되는 경우가 발생할 수 있다.
예를 들어 A라는 스레드의 결과값을 가지고 B스레드에 적용시켜야 할때 사용할 수 있다.

public class SumThread extends Thread{
    private long sum;
    
    public long getSum() {
        return sum;
    }
    
    public void setSum(long sum) {
        this.sum = sum;
    }
    
    public void run() {
        for(int i=1; i<=100; i++) {
            sum+=i;
        }
    }
}
public class JoinExample {
    public static void main(String[] args) {
        SumThread sumThread = new SumThread();
        sumThread.start();
        
        try {
            sumThread.join(); // sumThread가 종료될때까지 메인 스레드를 정지시킴 
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("1 ~ 100까지의 합 : " + sumThread.getSum());
    }
}
  • 1부터100까지 sum에 저장하고 그 결과를 getSum()메서드로 가져오기 전까지 main 메서드가 종료되지 않는다.

스레드의 스케줄링과 우선순위

  • 스레드 스케줄링 방식
  1. 선점형 스레드 스케줄링 방식
    • 스레드의 우선권을 가짐
    • 우선순위가 높은 스레드 먼저 수행
  2. 협력형 스레드 스케줄링 방식
    • 스레드가 CPU 사용권을 다른 스레드에게 넘길 때까지 기다림
    • JVM은 우선순위에 따른 선점형 스레드 스케줄링 방식 사용
  • 스레드 스케줄러
    1. 멀티 스레드가 수행될때 순서를 결정

    1. 자바 애플리케이션 - > 우선순위가 높은 선점형 스레드 스케줄러 사용
  • 스레드 우선순위

    • Thread 클래스에서는 우선순위 부여 메서드 setPriority(int newPriority) 메서드 제공
  • Thread 클래스의 우선순위를 정하는 멤버변수

동기화

  • 임계영역 : 멀티 스레드에 의해 공유자원이 참조될 수 있는 코드의 범위
    • 멀티 스레드 프로그램에서 임계영역을 처리 -> 문제 발생 가능
  • 이러한 상황을 동기화로 해결 -> 모든 객체에 락(lock) 포함
  • lock : 공유 객체에 여러 스레드가 동시에 접근하지 못하게함.
  • 모든 객체가 힙 영역에 생성될 때 자동으로 만들어 짐.
  • 특정 메서드의 동기화 방법
public synchronized void synchronizedMethod(){
	//임계영역 코딩
}

-특정 블럭 동기화 방법

public void nomalMethod(){
synchronized( 동기화할 객체 또는 클래스명 )
//임계영역 코딩
	}
}

공정 ( fairness )

  • 여러 개의 스레드가 하나의 컴퓨팅 자원을 사용함
  • 따라서 동시에 접근하는 프로그램 작성시 모든 스레드가 공정하게 자원사용하게 해야함

기아 ( starvation )

  • 하나 또는 그이상의 스레드가 자원을 얻기 위해 Blocked 상태
  • 그 자원을 얻을 수 없게 되면 다른 작업을 못하는 상태를 말한다.

교착상태 ( deadlock )

  • 두 개 이상의 스레드가 만족하지 못하는 상태로 계속 기다릴 때 발생한다.

동기화된 생산자와 소비자

  • Object 클래스의 wait(), notify(), notifyAll()
  1. 동기화된 스레드는 동기화 블록에서 다른 스레드에게 제어권을 넘기지 못함.
  2. 동기화된 블록에서 스레드간의 통신을 하기 위해 위 메서드 사용
  3. 이 메서드들은 synchronzied 블록에서만 사용가능
  4. 아닌 경우에 사용할 경우 illegalMonitorStateException 발생

0개의 댓글