반응형
개요
- 김영한 강사님의 강의를 듣고 정리하였다.
본론
자바에서 스레드를 어떻게 생성할까?
아마 학교나 기본적인 자바를 사용한 분들은 저처럼 스레드를 사용해볼 일도 적고 어떻게 사용하는지도 모른다.
그렇다면 스레드를 어떻게 만들어서 사용할 수 있을까?
- Thread 클래스를 상속받아서 사용
- Runnable 인터페이스를 구현 후 Thread 클래스를 인스턴스로 생성할 때 생성자에 매개변수로 전달
하나씩 살펴보자!
Thread 클래스를 상속
public class MyThread extends Thread{
@Override
public void run(){
// 필요한 작업 작성
}
}
- 위와 같이 Thread 클래스를 상속받은 후 run() 메서드를 재정의해준다.
public class main{
public static void main(String[] args){
MyThread thread = new Mythread();
thread.start();
}
}
- 해당 스레드를 생성해서 사용할 때는 위와같이 상속받은 나만의 MyThread를 객체화하고 이 인스턴스의 start() 메서드를 호출해주어야 한다.
- run() 메서드를 호출하지 않는 이유는 run() 메서드는 스레드가 해야할 일을 정의하는 메서드이고 start() 메서드는
새로운 스레드를 생성하고 해당 스레드가 run() 메서드를 수행
하도록 하는 메서드이기 때문이다. - 이 작업을 통해서 JVM의 스택 영역이 하나 새로생기고 새로운 스레드도 만들어지면서 재정의한 run() 메서드가 실행된다.
- run() 메서드를 호출하지 않는 이유는 run() 메서드는 스레드가 해야할 일을 정의하는 메서드이고 start() 메서드는
Runnable 인터페이스 구현
public interface Runnable{
void run();
}
- Runnable 인터페이스는 위와 같이 생겼다.
- 함수형 인터페이스와 동일하게 하나의 메서드만을 가진다.
public class MyRunnable implements Runnable{
@Override
public void run(){
//수행할 작업
}
}
- Runnable 인터페이스를 구현해준다.
public class main{
public static void main(String[] args){
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
// 람다
Thread thread2 = new Thread(() -> System.out.println("lambda!"));
thread2.start();
}
}
- 이렇게 Thread의 생성자에 MyRunnable을 매개변수로 넣어주면서 우리는 해당 스레드가 수행해야 할 작업을 전달해준다.
- 이 방식은 람다로 대체가 가능하다.
- 람다는 메서드를 전달해줄 수 있도록 하는 특별한 문법인데, 자바8의 등장과함께 등장한 함수형 인터페이스들과 동일하게 하나의 메서드만 존재하는 Runnable을 람다로 전달할 수 있기 때문이다.
중요한 점은 Thread의 상속과는 다르게 스레드의 생성과 스레드의 작업의 정의가 분리되어 가독성이 높아졌다는 것이다.
- Runnable의 사용은 상속이라는 제한이 없기 때문에 좀 더 자유롭다.
- 여러 스레드에 대해서 동일한 작업을 할당할 때도 쉽게 사용할 수 있다.
보통 Runnable을 이용한 스레드를 사용한다.
스레드의 종류
스레드는 사용자 스레드와 데몬(daemon) 스레드 2종류가 있다.
- 데몬 스레드는 이름에서 유추할 수 있듯이 백그라운드 작업을 수행하는 스레드이다.
- 차이점으로는 데몬 스레드의 작업은 프로그램이 기다리지 않기 때문에 모든 사용자 스레드가 종료되면 같이 종료된다는 특징이 있다.
// 데몬 스레드의 생성
public class MyThread{
public static void main(String[] args){
Thread thread = new Thread();
thread.setDaemon(true); // 기본값은 false이기 때문에 true로 하면 데몬스레드가 된다.
thread.start();
}
}
결론
자바에서 사용하는 스레드를 만드는 방법과 사용하는 방법에 대해서 알아보았다.
Spring 과 같은 프레임워크들은 여러 스레드를 생성해서 사용하는데 이렇게 스레드를 생성하고 사용하는지는 알 지 못했다.
- 스프링에서는 스레드풀을 사용하기 때문에 아마 스프링을 실행하는 시점에 많은 스레드를 어디 컬렉션같은 곳에 보관해두고 사용할 것 같다.
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 대기중인 스레드를 RUNNABLE로 깨우려면 어떻게 해야할까? (0) | 2024.09.21 |
---|---|
[JAVA] 스레드의 상태 (getState()) (3) | 2024.09.02 |
[JAVA] JVM, 자바의 메모리 구조 (0) | 2024.08.30 |
DES 알고리즘을 이용한 파일 암복호화 (0) | 2023.10.02 |
DES알고리즘(+Key Generator) 구현 (0) | 2023.10.02 |