❓ 스레드(Thread)란 무엇일까?
동작하고 있는 프로그램을 프로세스(Process)라고 합니다. 보통 1개의 프로세스는 한 가지의 일을 하지만, 스레드(thread)를 이용하면 한 프로세스 내에서 두 가지 또는 그 이상의 일을 동시에 할 수 있습니다.
* 프로세스 : 실행중인 프로그램
* 쓰레드 : 프로세스 안에 여러가지 작업들을 의미, 동시 실행 가능(병렬처리)
* 생성방법 ) 1) 인터페이스 상속 이용
* 2) 부모 클래스 상속 이용
간단한 예제를 통해 스레드를 구현해보겠습니다.
💡 Runnable 인터페이스 상속을 이용한 스레드 구현
public class BeepTask implements Runnable{
// TODO : 메서드 구현
// 쓰레드 작업을 실행시키는 함수
@Override
public void run() {
// TODO : 예제 : 삐소리를 들려 주는 코딩
// 멀티미디어 객체 가져오기
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 5; i++) {
toolkit.beep(); // 컴퓨터 삐소리
try {
// 공유 함수
Thread.sleep(500); // 0.5초 지연 후 삐 소리
} catch (Exception e) {
}
}
}
}
위의 예제는 스레드 작업 실행 시 윈도우 사운드인 비프음을 들려주는 코드입니다.
뒤에서 나올 예제에서 스레드 객체를 만들 때 스레드 클래스를 상속하여 만들기도 하지만 주로 Runnable 인터페이스를 사용합니다.
왜냐하면 스레드 클래스를 상속하면 스레드 클래스를 상속한 클래스가 다른 클래스를 상속할 수 없기 때문입니다.
위의 BeepTask 클래스는 Runnable 인터페이스를 사용하였습니다.
* description : 작업쓰레드 #1 : 삐소리
* main 함수 : 메인 쓰레드 : 화면출력 : 띵 글자 5번 출력
* 동시 실행
public class BeepTaskApplication {
public static void main(String[] args) {
// TODO : 1) 작업쓰레드 객체 생성
Runnable runnable = new BeepTask(); // 다형성
// TODO : 2) 쓰레드 생성자의 매개변수로 전달
Thread thread = new Thread(runnable);
// TODO : 3) 작업쓰레드 # 1 : 삐소리 실행(run() 실행됨)
thread.start();
// TODO : 4) 메인쓰레드 : 화면에 띵 글자 출력
for (int i = 0; i < 5; i++) {
System.out.println("띵");
try {
Thread.sleep(500); // 0.5 지연
} catch (Exception e){}
}
}
}
위의 BeepTaskApplication 클래스는 실행함수입니다.
메인 함수에서 다형성을 이용해 runnable 형태의 BeepTask 객체를 생성해주고,
스레드의 생성자(thread)의 매개변수로 runnable를 전달해줍니다.
그리고 작업스레드 #1을 실행하는 start함수를 이용해 실행시킵니다.
그리고 화면에 출력하기 위해 for 반복문을 사용하여 화면에 출력합니다. 여기서 예외처리를 통해 sleep 함수를 사용해 0.5초 지연을 시켜줍니다.
실행결과는 다음과 같습니다.
0.5초씩 지연되며 윈도우 비프음이 실행되며 '띵'이라는 글자가 출력됩니다.
띵
띵
띵
띵
띵
💡 Thread 클래스를 상속받아 스레드 구현
다음은 thread 클래스를 상속받아 스레드를 구현해보겠습니다.
public class BeepThread extends Thread{
// TODO : 쓰레드 작업을 실행시키는 함수
@Override
public void run() {
// TODO: beep 를 들려주는 코드
// 자바쪽 멀티미디어 객체 : 소리, 그림, 이미지 등등 다루는 객체
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 5; i++) {
toolkit.beep(); // 삐소리
try {
Thread.sleep(500); // 0.5 삐소리 지연
} catch (Exception e) {}
}
}
}
위의 BeepThread 클래스는 Thread 클래스를 상속받은 형태입니다.
run() 함수는 부모 클래스인 Thread 클래스의 run() 함수를 오버라이딩 하였습니다.
여기서 Toolkit은 JAVA 멀티미디어를 다루는 객체를 말합니다.
아래에 반복문을 통해 toolkit의 함수인 beep() 를 사용하여 윈도우 비프음을 실행시키고
예외처리를 통해 0.5초 지연을 해줍니다.
public class BeepThreadApplication {
public static void main(String[] args) {
// TODO : 1) 쓰레드 객체 생성
Thread thread = new BeepThread(); // 다형성
// TODO : 2) 쓰레드 실행 #1 : 내부적으로 run() 함수가 실행됨
thread.start();
// TODO : 3) main 쓰레드 작업 #2 : 화면 출력 (띵 * 5 출력)
for (int i = 0; i < 5; i++) {
System.out.println("띵");
try {
Thread.sleep(500); // 0.5초 지연
}catch (Exception e){}
}
}
}
위의 코드는 상속받은 스레드를 실행하는 클래스입니다.
먼저 메인 함수에서 스레드 객체를 생성해주고,
스레드 #1를 실행합니다.
그리고 for 반복문을 통해 화면에 출력해줍니다.
실행결과는 다음과 같습니다.
띵 // 윈도우 비프음과 동시에 실행됨
띵 // 윈도우 비프음과 동시에 실행됨
띵 // 윈도우 비프음과 동시에 실행됨
띵 // 윈도우 비프음과 동시에 실행됨
띵 // 윈도우 비프음과 동시에 실행됨
💡 요약
Thread 객체의 생성자로 Runnable 인터페이스를 구현한 객체를 전달하는 방법을 사용하면 Thread 클래스를 상속받아 구현한 것과 동일하게 작동합니다.
thread 객체가 Thread 클래스를 상속했을 경우에는 다른 클래스를 상속받을 수 없지만, 인터페이스를 사용한 경우에는 다른 클래스 상속이 가능하므로 좀 더 유연한 프로그램으로 만들 수 있습니다.
📖 Reference
'Java > Java 이론' 카테고리의 다른 글
[JSP] JSP 라이프사이클 (0) | 2024.07.03 |
---|---|
[JSP] Java Server Pages 란? (0) | 2024.07.03 |
중첩 클래스 (0) | 2023.10.02 |
람다 함수 (0) | 2023.10.02 |
파일 클래스를 이용한 파일 출력 (0) | 2023.10.02 |