본문 바로가기
안드로이드(Android)/Java

자바의 스레드 기초 프로그래밍

by 하센세 2011. 10. 7.

신입직원들을 상대로 제가 자바강의를 할 때 꼭 짚고 넘어가는 부분이 있습니다. “스레드(Thread)” 아무리 강조해도 지나침(?)이 없죠.

 

아마 중·고급 개발자들도 복잡도가 높은 스레드 관련 프로그래밍은 그 높은 복잡도에 넌더리(?)가 나는 경우가 많죠.

 

이번 포스트는 가장 쉬운 난이도의 자바 스레드 프로그래밍에 대해 이야기해 보고자 합니다.

 

스레드에 대한 자세한 설명은 기존 운영체제 교재나 자바교재를 참고하시고 이번 포스트에서는 프로그래밍 방법에만 초점을 두고 진행하겠습니다.

 

 

스레드 하면 일반적으로 Linux/Unix 시스템의 pThread를 떠올리게 되는데 운영체제에서 지원해주죠. 그런데 자바언어의 장점이 JVM을 이용하여 언어단에서 스레드를 지원해주며 프로그램도 무척 쉽습니다. 대표적으로 두 가지 방법으로 구현을 하는데 상속을 통한 방법이 있고 인터페이스를 통한 방법이 있습니다.

 

 

처음 자바 프로그램을 만들게 되면 public static void main(String args[]) 메소드 안에 모든 내용을 다 넣게 되죠. main 함수에 코드 내용을 구성하면 그 일은 메인 스레드가 해줍니다. 그림으로 보면 다음과 같습니다.

 

 

 

스레드를 생성한다는 것은 메인 스레드에서 또 다른 흐름의 분기 흐름을 만드는 내는 것입니다.

 

 

그럼, 이제 NewThread A~Z까지 출력하는 상속을 활용한 스레드 프로그램을 작성해 보겠습니다.

프로젝트 구성은 다음과 같이 만들겠습니다.

 


 

그럼, NewThread.java 파일부터 만들어 보겠습니다.

 

package com.tistory.hadol.thread;

public class NewThread extends Thread {

             //run()메소드는 스레드를 사용하면 무조건 사용해야하는 메소드

             //새롭게 생성한 스레드의 메인함수라고 생각하시면 되겠습니다.

             @Override

             public void run() {                 

                           for(char i = 'A'; i<='Z'; i++)

                                        System.out.print(i);

             }

}

 

 

다음은 메인 흐름입니다. 메인 흐름은 스레드를 하나 생성하는 것이 전부입니다. , 이 프로그램은 스레드를 하나 생성시키고 종료되는 프로그램이라는 말입니다.

 

package com.tistory.hadol.thread;

public class Main {

             public static void main(String[] args) {

                           // TODO Auto-generated method stub

                           NewThread nt = new NewThread();

                           nt.start();

             }

}

 

[ 결과 ]




그럼 이번에 인터페이스를 이용한 스레드 처리 기법을 추가해 보겠다. NewInterfaceThread란 클래스를 만들고 이번엔 1~10까지 출력을 해보자.

 

클래스가 하나 더 늘었으니 전체 프로젝트는 다음과 같은 모양이 되겠다.

 


 

인터페이스를 이용한 클래스의 코드는 다음과 같다.

 

package com.tistory.hadol.thread;

 

public class NewInterfaceThread implements Runnable {

             @Override

             public void run() {

                           // TODO Auto-generated method stub

                           for(int i=1; i<=10; i++){

                                        System.out.print(i);

                           }

             }

}

 

, 이때 메인 흐름의 그림은 다음과 같이 됩니다.

 


 

그럼 메인함수의 코드도 바뀌겠죠? 스레드를 두 개를 실행시켜줘야 하기 때문입니다.

 

그리고 스레드 클래스를 인터페이스를 통해서 실행시키는 방법은 한줄이 더 추가가 되어서 다음과 같이 바뀌게 됩니다.

 

package com.tistory.hadol.thread;

 

public class Main {

             public static void main(String[] args) {

                           // TODO Auto-generated method stub

                           NewThread nt = new NewThread();

                           nt.start();

                           ///////////////////////////////////////////////////////

                           NewInterfaceThread nit = new NewInterfaceThread();

                           Thread th = new Thread(nit);

                           th.start();

             }

}

 

그러면 결론은 어떻게 될까요? 아주 짧은 코드라 알파벳을 출력후에 숫자를 출력하게 되는 경우가 많겠지만 간혹 아래 그림과 같이 섞여서 출력되는 경우도 많습니다. 이유는 CPU 스케줄링에 따라서 이루어지겠죠.

 

[결론]