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