[Java] 스레드(thread)
운영체제에서는 실행중인 하나의 애플리케이션(프로그램)을 프로세스라고 부르며, 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는것이 프로세스의 개념이다.
스레드는 하나의 프로세스 내부에서 독립적으로 실행되는 작업단위로 운영체제에 의해 관리되는 하나의 작업 혹은 Task를 의미한다. 다중 스레드 작업시에는 각 스레드간 정보를 주고 받을 수 있어 처리 과정의 오류를 줄일 수 있다. 단, 프로세스간에는 정보를 주고 받을 수 없다.
JVM에 의해 하나의 프로세스가 발생하고 main() 문 안에 실행문들이 하나의 스레드를 발생한다. main() 외에 또 다른 스레드를 만들려면 Thread 클래스 상속받거나 Runnable 인터페이스를 구현하면되고 두 방법 모두 스레드를 통해 작업하고 싶은 내용을 run() 메소드에 작성해주면 된다.
✔ 스레드 클래스는 start() 실행시 run() 메소드가 수행되도록 내부적으로 처리
스레드 생성 방법1 (Thread 클래스 상속)
public class Thread1 extends Thread{
@Override
public void run() {
System.out.println("th1 Thread가 동작하고 있어요");
}
public static void main(String[] args) {
Thread1 th1 = new Thread1();
th1.start(); // 호출시 run() 실행
}
}
/* 실행결과
th1 Thread가 동작하고 있어요
*/
스레드 생성 방법2 (Runnable 인터페이스를 구현)
class TestRunnable implements Runnable{
@Override
public void run() {
System.out.println("스레드 동작중 ...");
}
}
public class Main3 {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " start!");
Runnable r = new TestRunnable();
Thread th1 = new Thread(r);
th1.start();
try {
th1.join();
// th1가 끝날때 까지 main 스레드가 종료되지않음
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " end!");
}
}
/* 실행결과
main start!
스레드 동작중 ...
main end!
*/
멀티스레드(multi thread)는 하나 프로세스 내에서 여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법으로 메모리 공유로 인한 시스템 자원 소모가 줄고 동시에 두가지 이상의 활용이 가능하지만 서로 자원을 소모하다가 충돌이 일어날 가능성이 있고 코드가 난해해질 가능성이 있다.
멀티 프로세스는 여러 프로세스를 동시에 실행하는 것을 의하며 , 멀티 스레드와 여러 흐름을 동시에 수행한다는 공통점이 있으나 멀티 프로세스는 각 프로세스가 독립적인 메모리를 가진다면 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점에서 차이가 있다.