ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의 정석 공부 - 프로세스와 쓰레드(작성중)
    코딩공부/자바 2023. 6. 8. 21:02

    프로세스: 실행 중인 프로그램 - 자원(메모리,cpu ,...)/ 쓰레드로 구성

    쓰레드: 프로세스 내에서 실제 작업을 수행 

    모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다. 

    프로세스 = 공장 / 쓰레드 = 일꾼 

     

    싱글 쓰레드 프로세스: 자원 + 쓰레드

    멀티 쓰레드 프로세스: 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드 -> 대부분의 프로그램 

     

    (요청마다)하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 듦 (전자:CGI, 후자: Java Servlet) -> 자바인기

     

    멀티쓰레드 장점

    • 시스템 자원을 보다 효율적으로 사용 가능
    • 사용자에 대한 응답성이 향상
    • 작업이 분리되어 코드가 간결해짐

     

    멀티쓰레드 단점 -> 공유에서 발생

    • 동기화에 주의해야 한다
    • 교착상태(dead-lock)가 발생하지 않게 주의해야 함
    • 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야함
    • 기아- 어떤 쓰레드는 자원을 할당받지 못함
    • -> 고려할 사항이 많다

    쓰레드의 구현과 실행 

    • 1. Thread 클래스 상속
      • 쓰레드클래스를 상속한 클래스의 객체 생성 -> 객체.start() : 쓰레드의 실행 
    Class MyThread extends Thread {
    	public void run() {}
    }
    MyThread t1 = new MyThread(); //쓰레드 생성
    t1.start(); //쓰레드 실행
    • 2. Runnable 인터페이스를 구현 -> 추천 (sort와 유사 -> 이게 뭐지? 공부할 것)
      • 메서드의 구현체를 외부에서 매개변수로 받음 
    class MyThread2 implements Runnable {
    	public void run()
    }
    Runnable r = new MyThread2();
    Thread t2 = new Thread (r);
    t2.start();

     

    예시 코드

    public class Ex13_1 {
        public static void main(String[] args) {
            ThreadEx1_1 t1 = new ThreadEx1_1();
    
            Runnable r = new ThreadEx1_2();
            Thread t2 = new Thread(r);
    
            t1.start();
            t2.start();
        }
    }
    class ThreadEx1_1 extends Thread {
        public void run() {
            for(int i = 0; i < 5; i++){
                System.out.println(getName());
            }
        }
    }
    class ThreadEx1_2 implements Runnable {
        public void run() {
            for(int i = 0; i < 5; i++){
                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    getName()은 this.getName()과 같음 (상속받은 것), Runnable을 구현한 클래스에서는 Thread.currentThread().getName()으로 작성 (쓰레드를 참조해야 함)

     

    쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작함(작업 대기 상태) -> OS 스케줄러가 실행순서 결정 (먼저 start()를 했다고 먼저 실행되지 않음) : OS에 종속적 

     

    start()메서드: mian()메서드에서 start()호출 -> start()가 새로운 호출 스택 생성 -> 새 스택에 run()을 올리고 종료 => 각각의 스택에서 main()과 run()이 서로 독립적으로 작업수행

     

    main쓰레드: main메서드의 코드를 수행하는 쓰레드 

    쓰레드의 두 종류: 사용자 쓰레드 / 데몬 쓰레드(보조 쓰레드) -> 실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램 종료

     

    예제 코드

    public class Ex13_11 {
        static long startTime = 0;
    
        public static void main(String[] args) throws InterruptedException {
            ThreadEx11_1 th1 = new ThreadEx11_1();
            ThreadEx11_2 th2 = new ThreadEx11_2();
            th1.start();
            th2.start();
            startTime = System.currentTimeMillis();
    
            try{
                th1.join();
                th2.join();
            }catch (InterruptedException e){}
    
            System.out.println("소요시간" + (System.currentTimeMillis() - startTime));
        }
    
    }
    class ThreadEx11_1 extends Thread {
        public void run () {
            for(int i = 0; i < 300; i++){
                System.out.print(new String("-"));
            }
        }
    }
    class ThreadEx11_2 extends Thread {
        public void run() {
            for(int i = 0; i < 300; i++){
                System.out.print(new String("|"));
            }
        }
    }

    th1.join(); : main 쓰레드가 th1의 작업이 끝날 때까지 기다림 

    main쓰레드가 종료되었다고 프로그램이 종료되는 것은 아님 

     

    싱글쓰레드

    • 순차적으로 작업 실행 

     

    멀티쓰레드

    • 시간과 순서를 OS스케줄러가 결정 -> 작업 순서가 섞임 
    • 작업에서 다른 작업으로 넘어갈 때 (context switching) -> 시간이 더 걸림 
    • 동시에 서로 다른 작업할 수 있음 
    • 작업을 좀 더 효율적으로 할 수 있음 

    쓰레드의 I/O블락킹 

    입출력 시 작업 중단 

     

    '코딩공부 > 자바' 카테고리의 다른 글

    java 문법 종합반 5주차  (0) 2023.05.31
    JAVA 문법 종합반 4주차  (1) 2023.05.26
    java 문법 종합반 3주차  (0) 2023.05.24
    java 문법 종합반 2주차  (0) 2023.05.23
    java 문법 종합반 1주차  (2) 2023.05.22
Designed by Tistory.