프로세스가 시작될 때, 최초의 실행 시작점이 되는 main() 함수, 그리고 그 곳부터 순차적으로 진행되는 실행 흐름, 이 또한 하나의 스레드이며, 메인 스레드(Main Thread)라고 부른다
Thread 클래스를 상속(extends)한 클래스를 만들고 run() 메서드를 오버라이드(override)한 다음, 클래스 인스턴스를 생성하고 start() 메서드를 호출
class NewThread extends Thread {
NewThread() {
}
public void run() {
// TODO : thread running codes.
}
}
NewThread nt = new NewThread() ;
nt.start() ;
Runnable 인터페이스를 구현(implements)하는 클래스를 선언하고 run() 메서드를 구현한 다음, 클래스 인스턴스를 Thread 클래스 인스턴스의 생성자에 전달하고 Thread 클래스 인스턴스의 start() 메서드를 호출
class NewRunnable implements Runnable {
NewRunnable() {
}
public void run() {
// TODO : thread running codes.
}
}
NewRunnable nr = new NewRunnable() ;
Thread t = new Thread(nr) ;
t.start() ;
첫번째 방법, thread 메서드를 상속(extends)하는 방법은 비효율적 일 수 있다! > why?
위의 방법에서는 run() 메소드만을 override한다. 다른 기능들도 재사용 되어야 하는데, 하나만 사용하는 것은 좀 비효율적인 느낌이다.
그리고 한번에 하나씩 상속되는 특성에 따라, Thread가 아닌 다른 클래스를 상속해야 한다면, 다중상속이 허용되지 않는 자바에서 Thread 클래스를 상속(extends)하여 스레드를 만드는 것이 불가능하다!
두번째 방법, Runnable 인터페이스룰 사용하면, abstract로 선언된 단 하나의 메서드, run() 메서드만을 가지기 때문에 효율적일 수 있다. 하지만 run()이외에 다른 것을 쓰려면 thread 메서드가 필요하다!
안드로이드 앱의 메인 UI 스레드 동작은 루프(Loop)와 핸들러(Handler) 클래스 구현을 통해 메인 UI 스레드를 작성할 수 있게 해준다.
안드로이드 앱 개발 시 일정시간 지연 후 무엇인가를 실행해야 하는 경우에 쓰는 방법이다.
import android.os.Handler;
Handler(Looper.getMainLooper()).postDelayed({
//Do something
}, 1000) //1초 후 실행
Handler(Looper.getMainLooper()).postDelayed({
//Do something
}, 4000) //위쪽 코드 실행 후 3초 후 실행
작업을 일정한 시간 후에 실행해야 할 경우 넣어주면 좋다!
추가로, 일정시간 동안 멈추는 상태
Thread.sleep(1000);