ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • day33_1 - JAVA (자바, 멀티 스레드)
    KIC/JAVA 2021. 7. 29. 12:00
    반응형

    [스레드의 일반적인 상태]

     

     

     

    [스레드 그룹]

    -> 관련된 스레드를 묶어 관리 목적으로 이용한다.

     

    -> 스레드 그룹은 계층적으로 하위 스레드 그룹을 가질 수 있다.

     

     

     

     

     

    [자동 생성되는 스레드 그룹]

     

     

     

    [스레드 그룹 생성]

     

    -> 부모 그룹을 지정하지 않으면 현재 스레드에 속한 그룹의 하위 그룹으로 생성한다.

     

     

     

     

    [스레드 폭증으로 일어나는 현상]

    ->병렬 작업 처리가 많아지면 스레드 개수 증가

    -> 스레드 생성과 스케줄링으로 인해 CPU가 바빠짐

    -> 메모리 사용량이 늘어남

    ->애플리케이션의 성능 급격히 저하

     

     

    [스레드 풀(Thread Pool)]

    ->작업 처리에 사용되는 스레드를 제한된 개수만큼 미리 생성해 놓는 것

    -> 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다.

     

    -> 작업 처리가 끝난 스레드는 작업 결과를 애플리케이션으로 전달 

     

    -> 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리

     

     

     

     

     

    [스레드 예제]

    (동기화 x)

    package javaPro.java_thread;
    
    
    // 스레드가 동기화 되지 않은 경우
    
    
    class PrintThread extends Thread {
        char ch;
    
        PrintThread(char ch) {
            this.ch = ch;
        }
    
        public void run() {
            for (int i = 0; i < 20; i++) {
                for (int j = 0; j < 80; j++) {
                    System.out.print(ch);
                }
                System.out.println();
            }
        }
    }
    
    public class ThreadEx8 {
        public static void main(String[] args) {
            Thread t1 = new PrintThread('A');
            Thread t2 = new PrintThread('b');
            Thread t3 = new PrintThread('C');
    
            t1.start();
            t2.start();
            t3.start();
        }
    }

     

    [스레드 예제2]

    동기화 o

    package javaPro.java_thread;
    
    // 스레드가 동기화 된 경우
    
    class PrintThread extends Thread {
        char ch;
    
        PrintThread(char ch) {
            this.ch = ch;
        }
    
        static int[] lock = new int[3];
    
        public void run() {
            for (int i = 0; i < 20; i++) {
                synchronized (lock) {
                    // 이렇게 synchronized으로 for문을 동기화 시킨다.
                    for (int j = 0; j < 80; j++) {
                        System.out.print(ch);
                    }
                    System.out.println();
                }
                // System.out.println();
            }
        }
    }
    
    public class ThreadEx8 {
        public static void main(String[] args) {
            Thread t1 = new PrintThread('A');
            Thread t2 = new PrintThread('b');
            Thread t3 = new PrintThread('C');
    
            t1.start();
            t2.start();
            t3.start();
        }
    }

     

     

     

     

     

    [동기화 메서드 예제]

    package javaPro.java_thread;
    
    /*
     * 동기화 영역
     *   동기화 메서드 예제
     *   => 공유객체의 메서드여야 함. 
     *   => 공유객체 : 모든 스레드가 하나의 객체를 공유하고 있어야 한다. */
    
    class Printer {
        public synchronized void printChar(char ch) { // 동기화 메서드
            for (int i = 0; i < 80; i++) {
                System.out.print(ch);
            }
            System.out.println();
        }
    }
    
    class PrintThread3 extends Thread {
        Printer ptr;
        char ch;
    
        PrintThread3(Printer ptr, char ch) {
            this.ptr = ptr;
            this.ch = ch;
        }
    
        public void run() {
            for (int i = 0; i < 20; i++) {
                ptr.printChar(ch);
            }
        }
    }
    
    public class ThreadEx10 {
        public static void main(String[] args) {
            Printer ptr = new Printer();
            Thread t1 = new PrintThread3(ptr, 'A');
            Thread t2 = new PrintThread3(ptr, 'B');
            Thread t3 = new PrintThread3(ptr, 'C');
    
            t1.start();
            t2.start();
            t3.start();
        }
    }
    300x250

    댓글

Designed by Tistory.