| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 알기쉬운 알고리즘
- 메모리구조
- insertion sort
- Selection Sorting
- C programming
- C 언어 코딩 도장
- Stack
- coding test
- s
- datastructure
- stream
- JSON
- buffer
- 윤성우의 열혈 자료구조
- R
- list 컬렉션
- Graph
- 이것이 자바다
- 이스케이프 문자
- 혼자 공부하는 C언어
- Serialization
- 윤성우 열혈자료구조
- Algorithm
- Today
- Total
Engineering Note
[Java] Thread 구현과 실행 본문
Thread 구현 방법
- Runnable 인터페이스 구현(Thread 클래스로 직접 생성)
- Thread 클래스를 상속
=> Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable 인터페이스를 구현하는 방법이 일반적이다.
Runnable 인터페이스 구현(Thread 클래스로 직접 생성)
- Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 다음과 같이 Runnable 구현 객체를 매개값으로 갖는 생성자를 호출하면 된다.
Thread thread = new Thread(Runnable target);
Runnable
- Thread가 작업을 실행할 때 사용하는 인터페이스이다. Runnable 인터페이스에는 run() 메서드가 정의되어 있는데, 구현 클래스는 run() 메서드를 overriding(재정의)해서 thread가 실행할 코드를 가지고 있어야 한다.
Runnable 구현 클래스 작성 방법
class Task implements Runnable {
@Override
public void run(){
//스레드가 실행할 코드
}
}
Runnable 구현 클래스는 thread에서 해야 할 작업 내용을 정의한 것이므로, 실제 작동시키기 위해서는 위에서 언급한 것처럼 thread에게 전달을 해주어야 한다. 다음과 같이 Runnable 구현 객체를 생성한 후 Thread 생성자 매개변수로 Runnable 객체를 전달하면 된다.
Ruunable task = new Task();
Thread thread = new Thread(task);
명시적인 Runnable 구현 클래스를 작성하지 않고 Thread 생성자를 호출할 때 Runnable 익명 구현 객체를 매개값으로 사용할 수도 있다.(더 많이 사용되는 방법)
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
//스레드가 실행할 코드
}
});
익명클래스를 활용하면 위에서 Runnable 인터페이스를 구현한 Task 클래스를 만들고 다형성으로 Task 인스턴스를 생성해 Thread의 파라미터로 전달하는 코드보다 간결하게 작성할 수 있다. (새로운 클래스를 하나 더 만들지 않아도 되므로)
이렇게 만들어진 작업스레드 객체를 실행하려면, Thread 객체의 start() 메서드를 이용해서 호출(실행)할 수 있다.
thread.start();
start() 메서드가 호출되면, 작업 스레드(main 쓰레드 내에서 호출된 thread)는 매개변수로 전달 받은 Runnable의 run() 메서드를 실행하면서 작업을 처리한다.
실습
아래 코드는 beep 소리와 함께 콘솔에 "띵"이라는 글자를 출력하는 프로그램을 작성한 것이다.
package thread;
import java.awt.*;
public class BeepPrintExample {
public static void main(String[] args) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i = 0; i < 20; i++) {
toolkit.beep();
try {
Thread.sleep(500);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
for(int i = 0; i < 20; i++) {
System.out.println("띵");
try {
Thread.sleep(500);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
}
그런데 원래의 의도와 다르게 beep 소리가 모두 완료된 후에 "띵"소리가 이후에 출력된다. 당연히 예상한 결과겠지만 하나의 쓰레드에서 프로그램이 실행되기 때문에 원하는 대로 결과가 달성되지 못했다. 이를 해결하기 위해서는 하나의 기능은 작업 스레드로 만들어서 구현하면 된다.
아래의 코드는 beep 소리가 나는 기능은 하나의 작업스레드로 만들어서 실행시켰고, "띵" 출력은 메인 스레드에서 실행시켰다. 아래처럼 코드를 구현하니 원하던대로 소리와 함께 "띵"소리가 출력되는 프로그램을 만들 수 있었다.
package thread;
import java.awt.*;
public class BeepPrintThreadExample {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i = 0; i < 20; i++) {
toolkit.beep();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
});
thread.start();
for(int i = 0; i < 20; i++) {
System.out.println("띵");
try {
Thread.sleep(1000);
}catch (InterruptedException e){}
}
}
}
참고 자료 : 이것이 자바다(신용권, 임경균)
'Programming Language > Java' 카테고리의 다른 글
| [Java] Lambda expression (0) | 2025.08.27 |
|---|---|
| [Java] Stream, map() (0) | 2025.08.27 |
| [Java] main thread 실행 흐름과 call stack, stack frame, main thread 개념 (1) | 2025.08.02 |
| [Java] Interface와 DI(Dependency Injection)를 통해 객체간 결합 낮추기, Interface를 사용하는 이유 (4) | 2025.08.01 |
| [Java] BufferedReader, Reader 객체와 Stream (0) | 2025.07.22 |