간단한 의미로 실행중인 프로그램
프로그램이 실행될 때마다 개별적으로 생성됨
프로그램에 필요한 데이터와 메모리 등 할당 받은 자원과 하나 이상의 스레드로 구성됨
프로세스 내에서 할당 받은 자원을 이용하여 실제 작업을 수행하는 작업 단위
main() 메서드 호출 시 JVM 에서 메인 스레드를 생성하여 프로그램을 시작한다.
2개의 스레드가 공유(객체)자원을 사용한다면 synchronized
를 사용해야 한다.
1개의 스레드에서 해당 자원을 사용하고 있을 경우 lock
상태로 다른 스레드가 접근하지 못하게 한다.
synchronized
사용 시 wait()
, notifiy()
메서드를 사용하지 않아도 됨
모든 Java 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작한다.
main()
의 첫 코드부터 아래로 순차적으로 실행되고 return
을 만나면 종료된다.
필요에 의해 작업 스레드들을 만들어서 병렬 코드 실행이 가능하다. ( 멀티 스레드를 이용한 멀티 테스킹 )
멀티 스레드인 경우 실행 중인 스레드가 하나라도 있는 경우 프로그램은 종료되지 않는다.
package sample;
public class MainThread {
public static void main(String[] args) {
// 메인 스레드 호출
System.out.println("Main Thread");
System.out.println("Main Thread");
System.out.println("Main Thread");
System.out.println("Main Thread");
System.out.println("Return 끝");
return;
}
}
메인 스레드에서 종료되었다는 디버그 메세지
package sample;
import javax.swing.JFrame;
public class SwingThread extends JFrame {
public static void main(String[] args) {
new SwingThread();
System.out.println("Main 끝");
}
public SwingThread() {
initMainFrame();
}
public void initMainFrame() {
setTitle("Swing Thread Ex");
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
main() 메서드는 println() 후 종료되었지만 JFrame 생성으로 awt 스레드는 동작 중
메인 스레드 외 추가적인 스레드를 이용하여 병력적으로 작업 처리
자원을 보다 효율적으로 사용 가능하며 사용자와 애플리케이션의 응답성 향상, 작업이 분리되어 코드가 간결해지며 CPU 사용률이 향상됨
동기화에 주의해야하며 교착상태(dead-lock)가 발생되지 않도록 주의해야 한다.
public class 클래스명 extends Thread {
// 상속처리 후, run() 메서드 오버라이드
@Override
public void run() {
// 작업할 코드 작성
}
}
public class Run {
public static void main(String[] args) {
// Thread를 상속한 객체 생성
클래스명 래퍼런스 = new 생성자();
// start() 메서드를 호출
래퍼런스.start();
}
}
public class 클래스명 implements Runnable {
// 상속처리 후, run() 메서드 오버라이드
@Override
public void run() {
// 작업할 코드 작성
}
}
public class Run {
public static void main(String[] args) {
// Runnable을 구현한 객체 생성
클래스명 래퍼런스 = new 생성자();
// 래퍼런스를 매개변수로 Thread 클래스 인스턴스 생성
Thread thread = new Thread(래퍼런스);
// start() 메서드를 호출
thread.start();
}
}
main() 메서드에서 run() 호출 시 main() 메서드 위에 쌓인다.
멀티 스레드를 구현하기 위해서는 main() 메서드에서 start() 메서드를 호출하여 start() 메서드가 새로운 스레드를 생성한 후 그 위에 run() 메서드를 실행한다.