[Java] 쓰레드

이용준·2022년 11월 8일
0

Java

목록 보기
27/29

1.쓰레드(Thread)

쓰레드, 프로세스 내에서 실제 작업을 수행하는 주체

  • 보통 한 개의 프로세는 한 가지 일을 하지만, 쓰레드를 이용하면 한 프로세스 내에서 두 가지 이상의 일을 동시에 할 수 있다.
  • 쓰레드 만들기
public class Test extends Thread{
    public void run() { // Thread 상속시 run 메서드 구현해야 한다.
        System.out.println("thread run");
    }

    public static void main(String[] args) {
         Test test = new Test();
         test.start(); // start()로 쓰레드 실행
    }
}
>> thread run //실행
  • Thread 클래스를 extends(상속)
    • Thread 클래스는 start 실행 시 run 메소드 수행되도록 내부적으로 동작
  • run 메소드 구현하면 sample.start() 실행시 sample객체의 run 메소드 수행
  • 쓰레드 동작 확인해보기
public class Test extends Thread{
    int seq;

    public Test(int seq){
        this.seq=seq;
    }
    public void run(){
        System.out.println(this.seq+" thread start."); // 쓰레드 시작
        try {
            Thread.sleep(1000); // 1초 대기
        }catch (Exception e) {
        }
        System.out.println(this.seq+" thread.end.");  //쓰레드 종료
    }

    public static void main(String[] args) {
        for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
            Thread t = new Test(i);
            t.start();
        }
        System.out.println("main end."); // main 메소드 종료
    }
}
--------------------------------------------------
(출력 결과)
main end.
9 thread start.
0 thread start.
5 thread start.
8 thread start.
2 thread start.
4 thread start.
6 thread start.
1 thread start.
3 thread start.
7 thread start.
1 thread.end.
3 thread.end.
9 thread.end.
2 thread.end.
6 thread.end.
5 thread.end.
0 thread.end.
4 thread.end.
8 thread.end.
7 thread.end.

총 10개의 쓰레드를 실행시켰다.

  • 어떤 쓰레드인지 확인 위해 쓰레드마다 생성자에 순번 부여.
  • 쓰레드 메소드(run) 수행시 시작과 종료 출력
  • 시작/종료 사이 1초 간격 생성(Thread.sleep(1000))

    쓰레드는 순서 상관없이 동시 실행되며, 쓰레드 시작 전 main 메소드 종료되었다.

2.Join

  • 쓰레드 종료 후 main 메소드 종료하는 방법
import java.util.ArrayList;

public class Test extends Thread{
    int seq;

    public Test(int seq){
        this.seq=seq;
    }
    public void run(){
        System.out.println(this.seq+" thread start."); // 쓰레드 시작
        try {
            Thread.sleep(1000); // 1초 대기
        }catch (Exception e) {
        }
        System.out.println(this.seq+" thread.end.");  //쓰레드 종료
    }

    public static void main(String[] args) {
        ArrayList<Thread> threads = new ArrayList<>();
        for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
            Thread t = new Test(i);
            t.start();
            threads.add(t);
        }
        for (int i = 0; i < 10; i++){
            Thread t = threads.get(i);
            try{
                t.join(); // t 쓰레드 종료까지 대기
            }catch (Exception e) {
            }
        }
        System.out.println("main end."); // main 메소드 종료
    }
}
---------------------------------------------------------------
(출력 결과)
7 thread start.
5 thread start.
1 thread start.
0 thread start.
3 thread start.
8 thread start.
2 thread start.
6 thread start.
4 thread start.
9 thread start.
9 thread.end.
8 thread.end.
5 thread.end.
7 thread.end.
3 thread.end.
4 thread.end.
6 thread.end.
1 thread.end.
0 thread.end.
2 thread.end.
main end.
  • ArrayList<Thread> threads = new ArrayList<>()
    • 생성된 쓰레드를 담기 위한 threads 생성 및 저장
  • main() 종료 전 threads에 담긴 thread에 join() 호출해 쓰레드 종료까지 대기
  • join() : 쓰레드의 join 메소드는 쓰레드 종료 전까지 대기하는 메서드

3.Runnable

  • Thread 클래스 상속시 다른 클래스 상속 불가.

  • 따라서, Runnable 인터페이스를 구현하는 방법을 주로 사용한다.

    Runnable 인터페이스를 사용하는 방식으로 변경

    import java.util.ArrayList;
    
    public class Test implements Runnable{
       int seq;
    
       public Test(int seq){
           this.seq=seq;
       }
       public void run(){
           System.out.println(this.seq+" thread start."); // 쓰레드 시작
           try {
               Thread.sleep(1000); // 1초 대기
           }catch (Exception e) {
           }
           System.out.println(this.seq+" thread.end.");  //쓰레드 종료
       }
    
       public static void main(String[] args) {
           ArrayList<Thread> threads = new ArrayList<>();
           for (int i=0; i<10; i++){ // 총 10개의 쓰레드 생성 및 실행.
               Thread t = new Thread(new Test(i)); // 변경
               t.start();
               threads.add(t);
           }
           for (int i = 0; i < 10; i++){
               Thread t = threads.get(i);
               try{
                   t.join(); // t 쓰레드 종료까지 대기
               }catch (Exception e) {
               }
           }
           System.out.println("main end."); // main 메소드 종료
       }
     }
  1. Thread를 extends 하던 것에서 Runnable을 implements 하도록 변경
  2. Thread 생성 구문 변경
Thread t = new Thread(new Test(i));

Thread의 생성자로 Runnable 인터페이스 구현한 객체 넘기는데 사용

profile
뚝딱뚝딱

0개의 댓글