[Java] Multithreading - Creating Thread

반응형

이번 글에서는 thread는 생성하는 방법에 대해 알아보도록 하겠습니다.

1. Creating Thread

java에서 thread를 생성하는 방법에는 크게 2가지가 있습니다.

먼저 아래와 같은 main thread가 존재한다고 가정해보겠습니다.

public class ch_3 {
    public static void main(String[] args) throws InterruptedException {
        for(int i=0; i<10; i++){
            System.out.println("I love Java");
            Thread.sleep(200);
        }

        for(int i=0; i<10; i++){
            System.out.println("I love JavaFx");
            Thread.sleep(200);
        }

        for(int i=0; i<10; i++){
            System.out.println("I love Android");
            Thread.sleep(200);
        }
    }
}

위의 결과는 순서대로 처리되며 총 처리시간은 최소 6초입니다.

만약 java / javaFX / android 작업을 병렬(parallel)로 처리하고자 할때 thread를 사용할 수 있습니다.

1-1) implements Runnable

thread를 사용하는 첫번째 방법은 Runnable 을 implements 하는 구현체를 생성하는 것 입니다.

/** java **/
public class JavaThreadTest implements Runnable {

    @Override
    public void run() {
        System.out.println("Starting Thread Name : " + Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("I love Java");
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Thread Completed : " + Thread.currentThread().getName());
    }
}

/** javaFX **/
public class JavaFXThreadTest implements Runnable {

    @Override
    public void run() {
        System.out.println("Starting Thread Name : " + Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("I love JavaFX");
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Thread Completed : " + Thread.currentThread().getName());
    }
}

/** Android **/
public class AndroidThreadTest implements Runnable {

    @Override
    public void run() {
        System.out.println("Starting Thread Name : " + Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("I love Android");
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Thread Completed : " + Thread.currentThread().getName());
    }
}

위와 같이 3개의 구현체를 생성하고, 구현체는 Runnable Interface의 run() 메서드를 override해 작업할 내역을 작성하면 됩니다.

이제 기존의 메인 메서드를 아래와 같이 변경할 수 있습니다.

public class ch_3 {
    public static void main(String[] args) throws InterruptedException {
        runJavaThread();
        runJavaFXThread();
        runAndroidThread();
    }

    private static void runJavaThread() {
        JavaThreadTest threadTest = new JavaThreadTest();
        Thread th = new Thread(threadTest);
        th.setName("JAVA_THREAD");
        th.start();
    }

    private static void runJavaFXThread() {
        JavaFXThreadTest threadTest = new JavaFXThreadTest();
        Thread th = new Thread(threadTest);
        th.setName("JAVAFX_THREAD");
        th.start();
    }

    private static void runAndroidThread() {
        AndroidThreadTest threadTest = new AndroidThreadTest();
        Thread th = new Thread(threadTest);
        th.setName("ANDROID_THREAD");
        th.start();
    }
}

앞서 생성한 각각의 구현체들을 Thread에 생성인자로 넣어주고, thread 인스턴스의 start 함수를 호출하면 thread는 주입된 runnable 구현체의 run 메서드를 수행하게 됩니다.

변경된 메인 메서드를 실행하면 기존의 java / javaFX / android 작업을 병렬로 처리하는 것을 확인할 수 있으며, 기존처리시간이였던 6초보다 단축된 시간을 사용해 작업을 끝 마칠 수 있게 됩니다.

1-2) extends Thread

thread를 생성하는 두번쨰 방법은 Thread 클래스를 상속하는 방법입니다.

Thread 클래스는 Runnable을 구현하고 있는 class 이므로, Thread를 상속하면 자동적으로 해당 class 또한 Runnable Inteface를 구현하게 됩니다.

Thread

public class Thread implements Runnable {
 ...
 ..
 .
}

Thread를 상속해 사용하더라도, 구현 방법은 동일합니다. run 메서드 내부에 해당 Thread에서 작업할 내용을 작성하면 됩니다.

public class JavaThreadTest extends Thread {

    @Override
    public void run() {
        System.out.println("Starting Thread Name : " + Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("I love Java");
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("Thread Completed : " + Thread.currentThread().getName());
    }
}

달라진 점은 이전에는 생성한 구현체 인스턴스를 Thread의 생성인자로 전달해 실행했지만, 이번에는 생성한 Thread 객체만 사용해 작업을 start 할 수 있습니다.

 private static void runJavaThread() {
     /** don't need Runnable implements Instance **/
     // JavaThreadTest threadTest = new JavaThreadTest();

     Thread th = new JavaThreadTest();
     th.setName("JAVA_THREAD");
     th.start();
 }

다음글에서는 Thread에서 사용할 수 있는 몇가지 메서드들을 살펴보도록 하겠습니다. 🙂


추천서적

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY