쓰레드 생성방법
- 방법 1 . Thread 클래스를 상속받아 run() 메서드를 오버라이딩하는 것
-> run() 메서드의 내부에서 작성된 내용이 바로 CPU를 독립적으로 사용하면서 동시에 실행되는 것
- 방법 2.1 Runnable 인터페이스를 구현한 Runnable 객체를 생성
-> 이 인터페이스는 추상메서드로 run() 메서드를 갖고 있음
-> 인터페이스 객체 생성과정에서 run() 메서드를 구현해야 함
- 방법 2.2 Thread 객체를 생성할때 1단계에서 생성한 Runnable 객체를 생성자로 전달
- 생성한 쓰레드를 실행하는 방법은 객체를 어떤 방법으로 실행했든 Thread 객체 내의 start() 메서드를 호출하는 것
- run()의 내용을 실행하기 위해서는 반드시 start() 메서드를 호출해야함
- start() 메서드로 한 번 실행된 Thread객체는 재사용할 수 없음
1. 쓰레드 생성 및 실행 방법
1) Thread 클래스를 상속받아 run() 메서드 재정의
step1. 클래스 정의
- Thread 클래스를 상속받아 run() 메서드를 오버라이딩한 클래스(또는 익명 이너 클래스) 정의
- 쓰레드에서 작업할 내용은 run() 메서드 안에 작성
class MyThread extends Thread {
@Override
public void run() [
//쓰레드 작업 내용
}
}
step2. 객체 생성
- 생성한 Thread 클래스의 기본 생성자를 이용해 객체 생성
Thread myThread = new MyThread();
또는
MyThread myThread = new MyThread();
step3. 쓰레드 실행
- start() 메서드를 이용해 쓰레드 실행
- start() = 새로운 쓰레드 생성/추가하기 위한 모든 준비 + 새로운 쓰레드 위에 run() 실행
myThread.start()
방법 1. 2개의 쓰레드 활용(main, SMIFileThread)
package StartThread;
//Thread 클래스를 상속해 클래스를 생성한 후 쓰레드 2개 생성
class SMIFileThread extends Thread {
//override
public void run() {
//자막 번호 하나~다섯
String[] strArray = {"하나","둘","셋","넷","다섯"};
try {Thread.sleep(10);} catch(InterruptedException e) {}
//자막 번호 출력
for(int i=0; i < strArray.length; i++) {
System.out.println("-(자막 번호)" + strArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
public class StartThread {
public static void main(String[] args) {
//SMIFileThread 객체 생성 및 시작
Thread smiFileThread = new SMIFileThread();
smiFileThread.start();
//비디오 프레임 번호 1~5
int[] intArray = {1,2,3,4,5};
//비디오 프레임 번호 출력
for(int i =0; i < intArray.length; i++) {
System.out.println("(비디오 프레임)"+intArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
- 멀티 쓰레드는 독립적으로 실행되기 때문에 먼저 start() 메서드로 호출됐다 하더라도 나중에 실행된 쓰레드보다 늦게 실행될 수 있다
- 자막 번호가 항상 비디오 번호 뒤에 나오도록 자막 쓰레드에 Thread.sleep(10)을 추가해 0.01초 늦게 출력되도록 함
방법 2. 3개의 쓰레드 활용 (main, SMIFileThread, VideoFileThread)
package StartThread;
//Thread 클래스를 상속해 클래스를 생성한 후 쓰레드 3개 생성
class SMIFileThread extends Thread {
//override
public void run() {
//자막 번호 하나~다섯
String[] strArray = {"하나","둘","셋","넷","다섯"};
try {Thread.sleep(10);} catch(InterruptedException e) {}
//자막 번호 출력
for(int i=0; i < strArray.length; i++) {
System.out.println("-(자막 번호)" + strArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
class VideoFileThread extends Thread {
//Override
public void run() {
//비디오 프레임 번호 1~5
int[] intArray = {1,2,3,4,5};
//비디오 프레임 번호 출력
for(int i =0; i < intArray.length; i++) {
System.out.println("(비디오 프레임)"+intArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
public class StartThread {
public static void main(String[] args) {
//SMIFileThread 객체 생성 및 시작
Thread smiFileThread = new SMIFileThread();
smiFileThread.start();
//VideoFileThread 객체 생성 및 시작
Thread videoFileThread = new VideoFileThread();
videoFileThread.start();
}
}
2) Runnable 인터페이스 구현 객체를 생성한 후 Thread 생성자로 Runnable 객체 전달
step 1. 클래스 정의
- Runnable 인터페이스를 구현한 클래스 정의 ( 추상 메서드 run() 구현)
- run() 추상 메서드를 구현하면서 여기에 쓰레드의 작업 내용을 작성
class MyRunnable implements Runnable {
//override
public void run() {
//쓰레드 작업 내용
}
}
step 2. 객체 생성
- 정의한 클래스를 이용해 Runnable 객체 생성
- Runnable 객체의 내부에는 start() 메서드가 존재하지 않기 때문에 start()를 갖고 있는 Thread 객체를 생성해야함
- 구현한 run() 메서드 자체에는 Runnable 객체가 갖고 있으므로 Thread 객체를 생성할 때 Runnable 객체를 생성자의 매개변수로 넘겨 준다.
-Thread 객체 내부의 run() 메서드는 생성자 매개변수로 넘어온 Runnable 객체 내부의 run()으로 대체 된다.
Runnable r = new MyRunnable();
또는
MyRunnable r = new MyRunnable();
Thread myThread = new Thread(r);
step 3. 쓰레드 실행
- Thread 객체의 start()를 호출해 쓰레드를 실행
myThread.start();
방법 1. 2개의 쓰레드를 활용 (main, SMIFileThread)
package StartThread;
//Runnable 인터페이스를 상속해 클래스를 생성한 후 쓰레드 2개 생성
class SMIFileRunnable implements Runnable {
//override
public void run() {
//자막 번호 하나~다섯
String[] strArray = {"하나","둘","셋","넷","다섯"};
try {Thread.sleep(10);} catch(InterruptedException e) {}
//자막 번호 출력
for(int i=0; i < strArray.length; i++) {
System.out.println("-(자막 번호)" + strArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
public class StartThread {
public static void main(String[] args) {
//SMIRunnable 객체 생성
Runnable smiFileRunnable = new SMIFileRunnable();
//smiFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
Thread thread = new Thread(smiFileRunnable);
thread.start();
//비디오 프레임 번호 1~5
int[] intArray = {1,2,3,4,5};
//비디오 프레임 번호 출력
for(int i =0; i < intArray.length; i++) {
System.out.println("(비디오 프레임)"+intArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
방법 2. 3개의 쓰레드 활용 (main, SMIFileThread, VideoFileThread)
- SMIFileRunnable = 자막 번호를 출력하는 객체
- VideoFileRunnable = 비디오 프레임 번호를 출력하는 객체
- main 쓰레드에서는 이들 2개의 객체를 생성자로 넘겨받아 쓰레드를 생성하고 실행하는 역할 수행
package StartThread;
//Runnable 인터페이스를 상속해 클래스를 생성한 후 쓰레드 2개 생성
class SMIFileRunnable implements Runnable {
//override
public void run() {
//자막 번호 하나~다섯
String[] strArray = {"하나","둘","셋","넷","다섯"};
try {Thread.sleep(10);} catch(InterruptedException e) {}
//자막 번호 출력
for(int i=0; i < strArray.length; i++) {
System.out.println("-(자막 번호)" + strArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
class VideoFileRunnable implements Runnable {
//Override
public void run() {
//비디오 프레임 번호 1~5
int[] intArray = {1,2,3,4,5};
//비디오 프레임 번호 출력
for(int i =0; i < intArray.length; i++) {
System.out.println("(비디오 프레임)"+intArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
}
public class StartThread {
public static void main(String[] args) {
//SMIRunnable 객체 생성
Runnable smiFileRunnable = new SMIFileRunnable();
//smiFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
Thread thread1 = new Thread(smiFileRunnable);
thread1.start();
//VideoFileRunnable 객체 생성
Runnable videoFileRunnable = new VideoFileRunnable();
//videoFileRunnable.start(); Runnable 객체에는 start() 메서드가 없어 오류 발생
Thread thread2 = new Thread(videoFileRunnable);
thread2.start();
}
}
방법 3. 이너 클래스를 활용한 쓰레드 객체 생성 및 실행
- 별도의 클래스를 정의하지 않고, 익명 이너 클래스를 문법을 사용해 Runnable 인터페이스 객체를 생성
- 실행되는 쓰레드는 main 쓰레드와 2개의 이름이 없는 익명 이너 클래스
package StartThread;
public class StartThread {
public static void main(String[] args) {
//자막 번호를 출력하는 쓰레드의 익명 이너 클래스 정의
Thread thread1 = new Thread(new Runnable() {
//override
public void run() {
//자막 번호 하나~다섯
String[] strArray = {"하나","둘","셋","넷","다섯"};
try {Thread.sleep(10);} catch(InterruptedException e) {}
//자막 번호 출력
for(int i=0; i<strArray.length; i++) {
System.out.println("-(자막번호)"+strArray[i]);
try {Thread.sleep(200);} catch(InterruptedException e) {}
}
}
});
//비디오 프레임 번호를 출력하는 쓰레드의 익명 이너 클래스의 정의
Thread thread2 = new Thread(new Runnable() {
//override
public void run() {
//비디오 프레임 번호 1~5
int[] intArray = {1,2,3,4,5};
//비디오 프레임 번호 출력
for(int i =0;i<intArray.length; i++) {
System.out.println("(비디오 프레임)"+intArray[i]);
try {Thread.sleep(200);}catch(InterruptedException e) {}
}
}
});
//Thread 실행
thread1.start();
thread2.start();
}
}
'Java' 카테고리의 다른 글
15 - 4 장 쓰레드의 동기화 (0) | 2023.06.14 |
---|---|
15 - 3장 쓰레드의 속성 (0) | 2023.06.14 |
15 - 1장 프로그램, 프로세스, 쓰레드 (0) | 2023.06.13 |
14 - 4장 사용자 정의 예외 클래스 (0) | 2023.06.13 |
14 - 3장 예외 전가 (0) | 2023.06.13 |