ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [java]쓰레드(Thread)와 Runnable
    Development/JAVA 2017. 2. 8. 23:56
    반응형

    쓰레드(Thread)를 잘 모르는 분들을 위해 쓰레드가 무엇인지 짚고 넘어가도록 하겠습니다.


    Thread는 하나의 프로세스(Process) 내부에서 작업을 처리하는 녀석입니다. 


    프로세스는 하나의 프로그램으로 보시면 되겠습니다.


    (ex : 프로세스는 엑셀이고 쓰레드는 엑셀 내부에서 함수처리 등 작업을 담당하는 녀석이죠)


    그래서 쓰레드보다 프로세스가 더 큰 개념입니다. (Thread < Process)


    '쓰레드'는 조립 PC를 구매해봤던 사람이라면 한 번쯤은 들어보셨을거에요 ㅎㅎ


    요즘 CPU는 쓰레드가 8, 16개 등 다양하게 있습니다.




    (이미지출처 : 다나와)




    그럼 지금부터는 코드를 통해 쓰레드 사용법을 알아보도록 하겠습니다.


    자바 혹은 C 프로그래밍을 하다보면 메인 메소드를 많이 보셨을겁니다.


    자바는 'public static void main(String[] args)' C는 'void main()' 이렇게요!


    주로 코드를 실행할 때 Main() 메소드(혹은 함수)에서 함수나 클래스를 호출하여 사용하게 됩니다.



    public class main {

    public static void main(String[] args) {

    System.out.println("메인 시작!");

    }

    }


    이렇게요~

    여기서 쓰레드를 사용하게 되면 Main() 뿐만 아니라 쓰레드에서도 동시다발적으로 함수를 호출하거나 실행할 수 있습니다.

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

    Thread를 상속받아 run()함수에 소스를 입력하면 끝입니다! 여기서 run()이 바로 main()과 같은 역할을 하는 것이죠!

    A a = new A();
    a.run(); //Method 호출

    여기서 A클래스를 불러오면 쓰레드가 실행될까요??

    아닙니다. 이것은 [쓰레드 실행]이 아닌 [메소드 호출]입니다.
    그렇다면 쓰레드를 실행하려면 어떻게 해야할까요??

    a.start()를 해주면 실행이 됩니다.

    단순히 run()을 실행해보면 큰 차이는 없습니다. 하지만 다음과 같이 실행해보면 그 차이를 확연히 알 수 있을겁니다.

    [소스]
    class A extends Thread
    {
    public void run()
    {
    System.out.println("A Thread!");
    }
    }



    public class main {

    public static void main(String[] args) {
    System.out.println("메인 시작!");
    A a = new A();
    a.run(); //Method 호출
    a.start();      //Thread 호출
    for(int i = 1; i<=100; i++)
    {
    System.out.print(i);
    if(i%10 == 0 ) System.out.print("\n");
    else System.out.print("\t");
    }
    }
    }



    a.run(); 실행했을 경우



    a.start(); 실행했을 경우



    어떤가요? 차이가 확실이 나죠? start()를 했을 때에는 순차적으로 실행되는 것이 아니라 main()과 같이 작동한다는 것을 알 수가 있습니다.


    여기서 의문을 가지실 수 있는 것은 자바에서는 다중 상속이 안되는데 어떻게 하는가 입니다.

    바로 Runnable라는 인터페이스를 사용하는 것인데요!

    쓰레드를 새로 생성한 뒤 다음과 같이 입력하면 됩니다^^


    [소스]
    class B extends Object implements Runnable
    {
    public void run()
    {
    System.out.println("B Thread!");
    }
    }



    public class main {

    public static void main(String[] args) {
    System.out.println("메인 시작!");
    B b = new B();
    Thread th = new Thread(b);
    th.start();
    for(int i = 1; i<=100; i++)
    {
    System.out.print(i);
    if(i%10 == 0 ) System.out.print("\n");
    else System.out.print("\t");
    }
    }
    }




    그러면 A 클래스처럼 B클래스의 쓰레드도 잘 작동하는 것을 볼 수가 있습니다^^







    반응형

    댓글

Designed by Tistory.