JAVA 일반 Java => Thread

2014.01.28 21:57

졸리운_곰 조회 수:636

 

 

 

[출처] https://wikidocs.net/230

Thread

쓰레드 역시 예제를 통해서 알아보는것이 가장 쉽다.

쓰레드는 가장 간단하게 다음과 같이 만들 수 있다.

Test.java

public class Test extends Thread {
    public void run() {
        System.out.println("thread run.");
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.start();
    }
}

Test클래스가 Thread 클래스를 상속했다. Thread 클래스의 run 메소드를 구현하면 위 예제와 같이 test.start() 실행 시 test객체의 run 메소드가 수행이 된다. (Thread 클래스를 extends 했기때문에 start 메소드 실행 시 run 메소드가 수행되는 것이다. Thread 클래스는 start 실행 시 run 메소드가 수행되도록 내부적으로 코딩되어 있다.)

위 예제를 실행하면 "thread 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);
        }catch(Exception e) {

        }
        System.out.println(this.seq+" thread end.");
    }

    public static void main(String[] args) {
        for(int i=0; i<10; i++) {
            Thread t = new Test(i);
            t.start();
        }
        System.out.println("main end.");
    }
}

총 10개의 쓰레드를 실행시키는 예제이다. 어떤 쓰레드인지 확인하기 위해서 쓰레드마다 생성자에 순번을 부여했다. 그리고 쓰레드 메소드(run) 수행 시 시작과 종료를 출력하게 했고 시작과 종료 사이에 1초의 간격이 생기도록(Thread.sleep(1000)) 작성했다.

그리고 main 메소드 종료 시 "main end."를 출력하도록 했다.

결과는 다음과 비슷하게 나올 것이다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

0 thread start.
4 thread start.
6 thread start.
2 thread start.
main end.
3 thread start.
7 thread start.
8 thread start.
1 thread start.
9 thread start.
5 thread start.
0 thread end.
4 thread end.
2 thread end.
6 thread end.
7 thread end.
3 thread end.
8 thread end.
9 thread end.
1 thread end.
5 thread end.

0번 쓰레드부터 9번 쓰레드까지 순서대로 실행이 되지 않고 그 순서가 일정치 않은 것을 보면 쓰레드는 순서에 상관없이 동시에 실행된다는 사실을 알 수 있다. 더욱 재밌는 사실은 쓰레드가 종료되기 전에 main 메소드가 종료되었다는 사실이다. main 메소드 종료 시 "main end."라는 문자열이 출력되는데 위 결과를 보면 중간쯤에 출력되어 있다.

Join

위 예제를 보면 쓰레드가 모두 수행되고 종료되기 전에 main 메소드가 먼저 종료되어 버렸다. 그렇다면 모든 쓰레드가 종료된 후에 main 메소드를 종료시키고 싶은 경우에는 어떻게 해야 할까?

다음의 예제를 보자.

public static void main(String[] args) {
    ArrayList<Thread> threads = new ArrayList<Thread>();
    for(int i=0; i<10; i++) {
        Thread t = new Test(i);
        t.start();
        threads.add(t);
    }

    for(int i=0; i<threads.size(); i++) {
        Thread t = threads.get(i);
        try {
            t.join();
        }catch(Exception e) {
        }
    }
    System.out.println("main end.");
}

생성되는 쓰레드를 담기 위해서 ArrayList 객체인 threads를 만든 후 쓰레드 생성시 생성된 객체를 threads에 저장한다. main 메소드가 종료되기 전에 threads 에 담긴 각각의 thread에 join 메소드를 호출하여 쓰레드가 종료될 때까지 대기하도록 변경하였다.

※ ArrayList 를 사용하기 위해서는 클래스 상단에 import java.util.ArrayList; 로 ArrayList를 먼저 import 해야 한다.

쓰레드의 join 메소드는 쓰레드가 종료될 때까지 기다리게 하는 메서드이다.

위와같이 변경한 후 프로그램을 수행하면 다음과 비슷한 결과가 나올것이다.

0 thread start.
5 thread start.
2 thread start.
6 thread start.
9 thread start.
1 thread start.
7 thread start.
3 thread start.
8 thread start.
4 thread start.
0 thread end.
5 thread end.
2 thread end.
9 thread end.
6 thread end.
1 thread end.
7 thread end.
4 thread end.
8 thread end.
3 thread end.
main end.

"main end." 라는 문자열이 가장 마지막에 출력되는 것을 확인 할 수 있다.

쓰레드 프로그래밍 시 가장 많이 실수하는 부분이 바로 쓰레드가 종료되지 않았는데 쓰레드가 종료된 줄 알고 그 다음 로직을 수행하게 만드는 일이다. 쓰레드가 종료된 후 그 다음 로직을 수행해야 할 때 꼭 필요한 것이 바로 이 join 메소드이다.

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);
        }catch(Exception e) {
        }
        System.out.println(this.seq+" thread end.");
    }

    public static void main(String[] args) {
        ArrayList<Thread> threads = new ArrayList<Thread>();
        for(int i=0; i<10; i++) {
            Thread t = new Thread(new Test(i));
            t.start();
            threads.add(t);
        }

        for(int i=0; i<threads.size(); i++) {
            Thread t = threads.get(i);
            try {
                t.join();
            }catch(Exception e) {
            }
        }
        System.out.println("main end.");
    }
}

Thread를 extends 하던 것에서 Runnable을 implements 하도록 변경되었다. (Runnable 인터페이스는 run 메소드를 구현하도록 강제한다.) 그리고 Thread 를 생성하는 부분을 다음과 같이 변경했다.

Thread t = new Thread(new Test(i));

Thread의 생성자로 Runnable 인터페이스를 구현한 객체를 넘길 수 있는데 이 방법을 사용한 것이다. 이렇게 변경된 코드는 이 전에 만들었던 예제와 완전히 동일하게 동작한다. 다만 인터페이스를 이용했으니 상속 및 기타 등등에서 좀 더 유연한 프로그램으로 발전했다고 볼 수 있겠다.

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
24 javac 로 컴파일 시 유니코드(utf-8) 한글 소스 코드 컴파일 문제 졸리운_곰 2015.02.02 932
23 [스프링] 스프링 Java 어노테이션 file 졸리운_곰 2014.06.11 758
22 [스프링] 스프링 MVC 졸리운_곰 2014.06.11 324
21 [스프링] 어노테이션 졸리운_곰 2014.06.11 848
20 인코딩 - 8859_1의 비밀(?) file 졸리운_곰 2014.05.06 487
19 [JNI] 안드로이드 JNI 환경에서 C++과 Java 간의 한글 데이터 전송 문제 졸리운_곰 2014.05.06 493
18 자바 암호화 복호화 file 졸리운_곰 2014.04.08 2384
17 파일 존재 여부 판단, 디렉토리 있는지 확인 함수; File Directory Exist 졸리운_곰 2014.03.03 1078
16 NetStat call and get result text in Java 졸리운_곰 2014.02.25 786
15 [Spring] @Autowired 와 Java Spring 졸리운_곰 2014.01.29 1158
14 Java Static 변수 졸리운_곰 2014.01.28 889
13 Properties 클래스 사용하기. 졸리운_곰 2014.01.28 852
» Java => Thread 졸리운_곰 2014.01.28 636
11 [Spring] 내가 Spring을 사랑하는 다섯 가지 이유 file 가을의 곰을... 2013.12.22 834
10 Java 세마포어(Semaphore) 가을의 곰을... 2013.12.11 2329
9 Java Thread 제어 (Thread Pool) 가을의 곰을... 2013.12.11 830
8 [Spring] VO 객체의 복사 가을의 곰을... 2013.11.26 4123
7 Java Delay (지연실행) 루틴 가을의 곰을... 2013.11.20 1172
6 Java Runtime시 Memory monitoring 가을의 곰을... 2013.11.19 685
5 Java Runtime시 CPU 모니터링 가을의 곰을... 2013.11.19 1069
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED