precess
)란?thread
)란?multi-threaded process
)라고 부른다.multi tasking
)이란?multi process
) vs
멀티 스레드( multi thread
)여러 흐름을 동시에 수행한다는 공통점을 가지고 있다.
Context Switching
을 위한 오버헤드가 발생한다.main thread
)모든 자바 애플리케이션은 메인 스레드가
main()
메소드를 실행하면서 시작된다.
메인 스레드는 main()
메소드의 첫 코드부터 아래로 순차적으로 실행하고,
main()
메소드의 마지막 코드를 실행하거나 return
문을 만나면 실행이 종료된다.
메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다.
즉 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성해야 한다.
어떤 자바 애플리케이션이건 메인 스레드는 반드시 존재하기 때문에 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생성하면 된다.
자바에서 스레드를 생성하는 방법은 두 가지 방법이 있다. 참고로 자바에서는 작업 스레드도 객체로 생성되기 때문에 클래스가 필요하다.
java.lang.Thread
클래스를 직접 객체화해서 생성하는 방법Thread
를 상속해서 하위 클래스를 만들어 생성하는 방법Thread
클래스로부터 직접 실행
java.lang.Thread
클래스로부터 작업 스레드 객체를 직접 생성하려면Runnable
을 매개값으로 갖는 생성자를 호출해야 한다.Thread thread = new Thread(Runnable target);
Runnable
인터페이스란?Runnable
인터페이스는 몸체가 없는 메소드인 run()
메소드 단 하나만을 갖는 간단한 인터페이스로, 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체라고 해서 붙여진 이름이다.
public interface Runnable {
public abstract void run();
}
Runnable
은 인터페이스 타입이기 때문에 구현 객체가 필요하다.
구현 클래스는 run()
을 재정의해서 작업 스레드가 실행할 코드를 작성해야 한다.
class Task implements Runnable {
public void run() {
//스레드가 실행할 코드;
}
}
Thread
생성
Runnable
은 작업 내용을 가지고 있는 객체이지, 실제 스레드는 아니다.
Runnable
구현 객체를 생성한 후, 이를 매개값으로 Thread
생성자를 호출해야 작업 스레드가 생성된다.
Runnable task = new Task();
Thread thread = new Thread(task);
코드 절약을 위해 Thread
생성자를 호출할 때 Runnable
익명 객체를 매개값으로 사용할 수 있다. (많이 사용되는 방식)
Thread thread = new Thread(new Runnable() {
public void run() {
//스레드가 실행할 코드;
}
});
Runnable
인터페이스는 함수적 인터페이스이기 때문에 람다식을 매개값으로 사용할 수도 있다.
Thread thread = new Thread(() -> {
//스레드가 실행할 코드;
});
Thread
실행작업 스레드는 start()
메소드를 호출해야만 비로소 실행된다. (생성되는 즉시 실행되는 것이 아니다!)
thread.start();
start()
메소드가 호출되면, 작업 스레드는 매개값으로 받은 Runnable
의 run()
메소드를 실행하면서 자신의 작업을 처리한다.
Thread
하위 클래스로부터 생성작업 스레드가 실행할 작업을
Runnable
로 만들지 않고,Thread
의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수도 있다.
Thread
클래스 정의 방법Thread
클래스를 상속한 후 run
메소드를 재정의(overriding
)해서 스레드가 실행할 코드를 작성한다. public class WorkerThread extends Thread {
@Override
public void run() {
//스레드가 실행할 코드
}
}
Thread thread = new WorkerThread();
코드 절약을 위해 Thread
익명 객체로 작업 스레드 객체를 생성할 수도 있다.
Thread thread = new Thread() {
public void run() {
//스레드가 실행할 코드;
}
}
Thread
실행이렇게 생성된 작업 스레드 객체에서 start()
메소드를 호출하면 작업 스레드는 자신의 run()
메소드를 실행하게 된다.
thread.start();
스레드는 자신의 이름을 가지고 있다. 스레드의 이름이 큰 역할을 하는 것은 아니지만,
디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 가끔 사용된다.
main
이라는 이름을 가지고 있고,Thread-n
이라는 이름으로 설정된다. (n
: 스레드의 번호)Thread-n
대신 다른 이름으로 설정하고 싶다면 Thread
클래스의 setName()
메소드로 변경하면 된다.Thread
이름 관련 메소드 정리thread.setName("스레드 이름");
thread.getName();
setName()
과 getName()
은 Thread
의 인스턴스 메소드이므로 스레드 객체의 참조가 필요하다. 만약 스레드 객체의 참조를 가지고 있지 않다면, Thread
의 정적 메소드인 currentThread()
로 코드를 실행하는 현재 스레드의 참조를 얻을 수 있다.
Thread thread = Thread.currentThread();
이것이 자바다 책
http://tcpschool.com/java/java_thread_concept
https://makecodework.tistory.com/entry/Java-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda-%EC%9D%B5%ED%9E%88%EA%B8%B0
https://mangkyu.tistory.com/92