스레드 Thread

HH_Nebula·2022년 9월 21일
0

프로세스 Process

간단한 의미로 실행중인 프로그램
프로그램이 실행될 때마다 개별적으로 생성됨
프로그램에 필요한 데이터와 메모리 등 할당 받은 자원과 하나 이상의 스레드로 구성됨


스레드 Thread

프로세스 내에서 할당 받은 자원을 이용하여 실제 작업을 수행하는 작업 단위
main() 메서드 호출 시 JVM 에서 메인 스레드를 생성하여 프로그램을 시작한다.


동기화 synchronized

2개의 스레드가 공유(객체)자원을 사용한다면 synchronized 를 사용해야 한다.
1개의 스레드에서 해당 자원을 사용하고 있을 경우 lock 상태로 다른 스레드가 접근하지 못하게 한다.
synchronized 사용 시 wait() , notifiy() 메서드를 사용하지 않아도 됨


메인 스레드 Main Thread ( Single Thread )

모든 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 스레드는 동작 중

멀티 스레드 Multi Thread

메인 스레드 외 추가적인 스레드를 이용하여 병력적으로 작업 처리
자원을 보다 효율적으로 사용 가능하며 사용자와 애플리케이션의 응답성 향상, 작업이 분리되어 코드가 간결해지며 CPU 사용률이 향상됨

동기화에 주의해야하며 교착상태(dead-lock)가 발생되지 않도록 주의해야 한다.


스레드 생성

#1. Thread Class 상속

public class 클래스명 extends Thread {
	// 상속처리 후, run() 메서드 오버라이드
    @Override
    public void run() {
    	// 작업할 코드 작성
    }

}
public class Run {

	public static void main(String[] args) {
    	// Thread를 상속한 객체 생성
    	클래스명 래퍼런스 = new 생성자();
        
        // start() 메서드를 호출
        래퍼런스.start();
    }

}

#2. Runnable Interface 구현

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();
    }

}

run()과 start()

main() 메서드에서 run() 호출 시 main() 메서드 위에 쌓인다.
멀티 스레드를 구현하기 위해서는 main() 메서드에서 start() 메서드를 호출하여 start() 메서드가 새로운 스레드를 생성한 후 그 위에 run() 메서드를 실행한다.

profile
공부하고 기록하고 복습하고

0개의 댓글