Thread

서이·2022년 9월 16일
0

Java

목록 보기
17/27

프로세스(Process)

 운영체제에 의해 메모리 공간을 할당받아 CPU에서 실행/제어되고 있는 프로그램이다.

 프로세스는 실행중인 프로그램이다. 즉, 메모리에 올라간 상태이다.
우리가 웹 서핑을 하기 위해 크롬 아이콘을 더블 클릭하는 순간 하나의 프로세스가 동작되는 것이다.



멀티태스킹(Multi-Tasking)

 멀티태스킹은 여러 개의 프로그램을 동시에 띄우는 것을 의미한다.
우리는 컴퓨터로 음악(프로세스)을 들으면서 워드 문서작업(프로세스)을 동시에 할 수 있다.

 사실 우리의 눈으로는 음악과 문서작업을 동시에 처리하는 것처럼 보이지만 그렇지 않다.

 하나의 코어가 동작하기 위한 프로세스들을 빠르게 왔다갔다 하면서 일을 처리하는데 속도가 너무 빠르기 때문에 우리 눈에는 동시에 하는 것처럼 보일 뿐이다.



쓰레드(Thread)

 쓰레드는 실행 흐름(절차)을 갖는 줄이다. 즉, 프로세스 내에서 실행 흐름을 의미한다.

 프로세스 내의 명령어 블록으로 시작점과 종료점을 가진다.

스레드와 프로세스의 차이점
프로세스는 완벽히 독립적이기 때문에 메모리 영역을 다른 프로세스와 공유를 하지 않지만
스레드는 해당 스레드를 위한 스택을 생성할 뿐 프로세스 내의 메모리를 공유해서 사용할 수 있다.

 작업관리자에서 실행중인 프로세스를 자세히 보면 몇 개의 쓰레드가 돌아가고 있는지 확인할 수 있다.

 위의 사진은 구글 크롬 브라우저를 실행하는데 30개의 쓰레드가 돌아가고 있다.




자바에서 쓰레드를 사용하는 이유

 동시에 두 가지 이상의 활동을 하기 위함이다.
그리고 프로세스끼리는 정보를 주고 받을 수는 없지만, 다중 쓰레드 작업 시에 각 쓰레드끼리는 정보를 주고받을 수 있는 장점이 있다.




자바에서 쓰레드를 생성하는 방법은 크게 두 가지로 나뉜다.

1. Runnable 인터페이스 구현

1 - 1. 별도의 클래스로 구현하여 쓰레드를 실행할 수 있다.

 Runnalbe은 인터페이스이기 때문에 이를 implements한 클래스에서 쓰레드가 실행할 코드를 구현해야 한다.

public class Program {

    public static void main(String[] args) {
        Thread th = new Thread(new RunnableTest());
        th.start();
    }
}

public class RunnableTest implements Runnable {

    @Override
    public void run() {
        // 실행할 문장
        for (int i = 1; i <= 100; i++) {
            System.out.printf("쓰레드: %d\n", i);
        }
    }
}

1 - 2. 생성자로 이름 없는 구현 객체를 넘겨 쓰레드를 선언할 수 있다.

public class Program {

    public static void main(String[] args) {
        Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
                // 실행할 문장
                for (int i = 1; i <= 100; i++) {
                    System.out.printf("쓰레드: %d\n", i);
                }
            }
        });
        th.start();
    }
}

2. Thread를 상속하는 자식 클래스에서 run() 메서드 오버라이딩

public class Program {

    public static void main(String[] args) {
        Thread th = new MyThread();
        th.start();
    }
}

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.printf("쓰레드: %d\n", i);
        }
    }
}

 마찬가지로 쓰레드 객체를 한 번만 사용할거라면 변수를 선언하지 않고 바로 선언이 가능하다.

public class Program {

    public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) 
                    System.out.printf("쓰레드: %d\n", i);
            }
        }
    }
}
profile
작성자 개인이 잊을 때마다 보라고 정리한 글

0개의 댓글

관련 채용 정보