쓰레드(Thread)를 알아보기에 앞서 프로세스와 멀티태스킹에 대해 알아보겠습니다.
프로세스(Process)
프로세스는 실행중인 프로그램이다. 즉, 메모리에 올라간 상태이다.
우리가 웹 서핑을 하기 위해 크롬 아이콘을 더블 클릭하는 순간 하나의 프로세스가 동작되는 것이다.
멀티태스킹(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);
}
}
}
}
'Programming > Java' 카테고리의 다른 글
[Java] 제네릭(Generic)을 예시를 통해 알아보자 (0) | 2020.10.24 |
---|---|
[Java] 인터페이스에 대해 알아보자 (0) | 2020.10.17 |
[Java] 캡슐화와 은닉성에 대해 알아보자 (0) | 2020.10.02 |
[Java] String / StringBuilder / StringBuffer의 차이점은 무엇일까? (0) | 2020.09.27 |
[Java] Enum 클래스에 대해 알아보자 (0) | 2020.09.14 |