Thread란?
Process 내부의 실행단위입니다.
Process는 프로그램입니다. 크롬브라우저, 카카오톡, 이클립스, 곰플레이어 같은 프로그램이 Process 입니다.
사전적인 의미로는 실입니다. 여러 실들이 합쳐져서 옷이 만들어지는 것처럼 여러 스레드가 합쳐져서 하나의 Process를 만드는 것입니다.
예를 들어 동영상 플레이어 실행 Process가 있다고 하면 그 안에는 영상 Thread, 음향 Thread, 자막 Thread 가 동시에 실행되고 있는 것입니다.
Thread 실행방법
1. extends Thread
단일 상속이라서 사용이 제한적입니다.
2. implements Runnable
다중 상속이 가능해서 implements Runnable 사용을 추천합니다.
Thread 실행 원리
start()
개발자가 Thread를 실행 가능(Runnable) 상태로 보낼 때 호출하는 메소드입니다.
run()
JVM이 스케줄링을 하면 실행(Running)되는 메소드입니다. Thread에서 해야하는 메소드를 작성
예시를 안보면 섭섭하죠.
예시
/*
* implements Runnable 방식으로 변경해서 제작
*
* 사업이 번창하여 일꾼을 여러명 채용해서 업무 시작
* => Worker 스레드를 여러개 생성해서 start 시켜 멀티스레딩 시작
*
* 전체 일꾼 4명 ( thread 4 )
* : main thread ( 사장 일꾼 )
* Worker Thread 1 - hosose
* Worker Thread 2 - pabeba
* Worker Thread 3 - Jason
*/
public class TestThread3 {
public static void main(String[] args) {
Worker worker=new Worker();
Thread thread=new Thread(worker,"hosose일꾼");
thread.start();//현 스레드를 실행가능 상태로 전송
Thread thread2=new Thread(worker,"pabeba일꾼");
thread2.start();//현 스레드를 실행가능 상태로 전송
Thread thread3=new Thread(worker,"Jason일꾼");
thread3.start();//현 스레드를 실행가능 상태로 전송
System.out.println("main thread 종료");
}
}
package step3;
/*
* implements Runnable 로 스레드 생성하는 것을 더 추천
* 이유는 자바는 단일 상속이기 때문입니다.
*/
public class Worker implements Runnable{
@Override
public void run() {// jvm 이 실행
try {
work();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void work() throws InterruptedException {
//현재 실행중인 스레드의 이름을 받아옵니다.
String threadName=Thread.currentThread().getName();
for(int i=1;i<9;i++) {
Thread.sleep(1000);
System.out.println(threadName+" "+i+"시간 일하다");
}
}
}
이런 식으로 run 안에 실행해야하는 메소드인 work() 를 작성해서 Thread들을 일 시킵니다.
결과는 직접 확인해보시면 아시겠지만
main thread 종료
hosose일꾼 1시간 일하다
Jason일꾼 1시간 일하다
pabeba일꾼 1시간 일하다
Jason일꾼 2시간 일하다
hosose일꾼 2시간 일하다
pabeba일꾼 2시간 일하다
Jason일꾼 3시간 일하다
hosose일꾼 3시간 일하다
pabeba일꾼 3시간 일하다
.
.
.
이런식으로 나옵니다.
Daemon Thread 데몬 스레드
자신을 실행시킨 Thread가 종료되면 함께 종료되는 Thread 입니다.
예를 들어
백업 작업, 워드 Process 작업 시 1분에 한번 백업 작업이 진행되도록 처리합니다.
-> 워드 작업이 종료되어 Process가 종료되면 백업 작업도 함께 종료되어야 합니다.
예시코드
/*
Daemon Thread 데몬 스레드: 자신을 실행시킨 스레드가 종료되면 함께 종료되는 스레드
ex) 백업 작업, 워드 프로세스 작업시 1분에 한번 백업 작업이 진행되도록 처리
-> 워드 작업 종료되어 프로세스가 종료되면 백업 작업도 함께 종료되어야 함
워드 스레드 시작 시점에 백업 스레드도 함께 시작
워드작업은 1초 단위로 실행 , 백업작업은 3초 단위로 실행
*/
public class TestThread5 {
public static void main(String[] args) {
Word word=new Word();
Thread wordThread=new Thread(word);
wordThread.start();
System.out.println("메인 스레드 종료");
}
}
public class Word implements Runnable{
@Override
public void run() {
try {
BackupWorker backupWorker=new BackupWorker();
Thread backupThread=new Thread(backupWorker);
//자신을 실행한 스레드가 종료되면 함께 종료되도록 데몬 스레드로 설정
// 워드스레드의 작업이 종료되면 백업스레드의 작업도 함께 종료
backupThread.setDaemon(true);
backupThread.start();
word();
backupWorker.backup();//최종적으로 백업 처리하기 위해 직접 backup() 을 호출
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void word() throws InterruptedException {
for(int i=0;i<20;i++) {
System.out.println("워드 문서 작업 "+i);
Thread.sleep(1000);
}
}
}
public class BackupWorker implements Runnable{
@Override
public void run() {
try {
backupExecute();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void backupExecute() throws InterruptedException {
while(true) {
Thread.sleep(3000);
backup();
}
}
public void backup() {
System.out.println("**백업스레드가 문서를 백업한다**");
}
}
쓰레드랑 프로세스를 한국어로 작성하겠습니다. 맥북은 한영 변경이 번거롭네요.
백업 쓰레드를 만들었지만 워드 쓰레드 안에 넣어서 워드 쓰레드가 종료될 때 백업 쓰레드도 같이 종료되는 것으로 만들었습니다.
함수는 setDaemon(true);로 매개변수에 boolean 값인 true를 넣어야지만 워드 쓰레드가 종료될 때 같이 백업 쓰레드도 종료됩니다.
소감
Thread를 이용해서 여러개의 동작을 동시다발적으로 작업할 수 있게 되었습니다. 예전에 사용하는 데스크탑 및 노트북은 코어의 개수가 적어 이렇게 직접 프로그래밍을 통해 쓰레드를 만들었다고 합니다.(맞겠죠?ㅎㅎ)
아직 몇가지 기능밖에 사용하지 않았지만 필요 시 여러가지 메소드를 찾아보고 검색하여 사용해봐야겠습니다.
'코딩 개발 > Java' 카테고리의 다른 글
Java - Network 응용 심화편(장코드 주의) (0) | 2023.04.26 |
---|---|
Java - Network (Socket 통신) (2) | 2023.04.24 |
Java - ObjectInputStream & ObjectOutputStream (2) | 2023.04.20 |
Java - File Class에 대한 간단한 예제 (0) | 2023.04.18 |
Java - Exception handling (feat. try, catch, throw, throws) (2) | 2023.04.14 |