안드로이드 스튜디오 스레드(Thread) 구현하기

728x90

카드 맞추기 앱을 구현하면서 타이머 때문에 스레드를 다루게 되어 정리할 겸 포스팅하기로 했다.

 

하나의 동작하는 프로그램을 프로세스(Process)라고 하며 하나의 프로세스는 한 가지 일밖에 하지 못한다.

 

하지만 프로세스 안에 있는 스레드를 이용한다면 두 가지 이상의 일을 동시에 할 수 있다.

 

물론 보다 정확히 말하자면 동시에 하는 것처럼 보이게 할 수 있는 것이다.(스레드에 대해 자세한 정리는 기회가 되면 포스팅하겠다.)

 

이를 병렬 처리라 하며 안드로이드의 자바 코드로 스레드를 구현하는 방법은 두 가지가 있다.

 

첫 번째는 Thread 클래스를 상속받는 방법이고 두 번째는 Runnable 인터페이스를 구현하여 Thread 객체에 전달하는 방법이다.

 

Thread 클래스


public class MyThread extends Thread {
    // run() 메소드를 오버라이드
    public void run() {
    	// 수행할 로직
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        // MyThread 객체를 생성한 후, start() 메소드를 호출하여 실행
        MyThread thread = new MyThread();
        thread.start();
    }
}

위 내용은 스레드를 상속받아 사용하는 코드이다.

 

start() 메서드를 실행하면 Thread 클래스 내부에서 run() 메서드를 실행하기 때문에 꼭 thread.run()이 아닌 thread.start()로 하는 것을 잊으면 안 된다.

 

Runnable 인터페이스


Thread는 Class를 상속(Extends) 받기 때문에 Java의 단일상속에 의해 다른 Class를 상속받을 수 없어 유용하지 않은 편이다.

 

또한 Thread를 상속받을 경우 Thread Class에 구현된 모든 코드들이 동작하기 때문에 자원을 많이 잡아먹어 효율적이지 못하다.

 

이를 해결하기 위해 Runnable 인터페이스를 구현(Implements)하고 Thread 객체에 전달하면 대부분의 구현을 할 수가 있다.

 

public class MyRunnable implements Runnable {
    // run() 메소드를 오버라이드
    public void run() {
    	// 수행할 로직
        System.out.println("Hello from a thread!");
    }

    public static void main(String[] args) {
        // MyRunnable 객체를 생성한 후, 이를 Thread 생성자에 전달
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

 

위 내용은 Runnable 객체를 생성한 후 Thread 생성자에 전달해서 Thread를 생성하고 실행한다.

 

이때 생성한 Runnable 객체는 다른 클래스에서도 사용할 수 있기 때문에 유연한 코드 작성이 가능하다.

 

Thread는 상속이고 Runnable은 Interface이기 때문에 다중 상속이 불가능한 Java에서 Runnable 객체는 아주 유용한 작성방법이다. 

 

Runnable 인터페이스를 이용한 Thread 수행 시에도 내부적으로 Run() 메서드를 오버라이드 하기 때문에 thread.run()이 아닌 thread.start()를 해야 한다.

 

Thread를 사용하는 대표적인 예시가 타이머이기 때문에 마지막으로 Runnable Interface를 이용한 타이머를 예제로 설명하겠다.

 

public class MyRunnable implements Runnable {
    // run() 메소드를 오버라이드
    public void run() {
    	// 스레드가 실행할 로직 구현
        int second = 0;
        System.out.println("===== 타이머 실행 =====");
        // 타이머에 자주 쓰는 코드
        while (true){
            System.out.println("실행시간 : " + second);
            try {
                Thread.sleep(1000); 	// 1초 딜레이
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
            second++;
        }
        System.out.println("===== 타이머 종료 =====");
    }

    public static void main(String[] args) {
        // MyRunnable 객체를 생성한 후, 이를 Thread 생성자에 전달
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

 

위 예제는 While문을 통해 무한 루프를 돌면서 Thread.sleep으로 1초간 딜레이를 주는 타이머다.

 

이때 종료하고 싶은 시점에서 thread.stop()이나 thread.interrupt()를 호출하면 Run() 메서드 내부에서 Catch문에 걸려 종료할 수 있다.

 

thread.stop()은 불완전한 메서드이기 때문에 thread.interrupt()를 추천한다.

728x90

댓글()