Thread(스레드)

2023. 7. 19. 12:30JAVA

Thread(스레드) : 동시에 여러 작업을 처리하는 기법


1. Process : 실행중인 하나의 자바 프로그램 [ 본인만의 메모리영역을 가짐(Method, Stack, Heap)] - 프로세스간에는 자원공유 불가


2. Thread  : 하나의 프로세스안에서 동작하는 일꾼(직원)같은 개념 - 하나의 프로세스안에서 스레드간에는 자원공유 가능

즉, Thread는 작성되어 있는 코드를 읽어서 실행하는 녀석으로 생각하면 됨.


하나의 프로세스에는 적어도 하나의 스레드가 기본적으로 존재하며 이 스레드를 Main Thread 라고 부름(사장같은 개념)

 

Thread를 새로 만들지 않는한 Main Thread가 혼자서 위 코드를 읽어서 실행하기에


동시에 실행되지 않고 차례대로 실행됨.

 

동시에 하려면? 별도의 직원(Thread의 능력을 가진)객체가 필요함


이 직원이 해야할 작업(Task)을 작성해놓은 클래스를 설계


직원채용 - Thread 객체 생성

 

파일을 다운로드 하면서 음악 재생을 하기위해 다음과 같이 작업했음

//파일 다운로드 작업을 수행하는 직원 클래스 - Thread의 능력을 가진...
class ThreadA extends Thread{
	//모든 Thread클래스의 작업은 반드시 이 메소드안에서 작성 해야만 함.
	//Thread클래스 안에 원래 있는 run()메소드를 오버라이드 해서 사용해야만 함.
	@Override
	public void run() {
		for(int i=0; i<20; i++) {
			String name= Thread.currentThread().getName();
			System.out.println(name+" : " + i + "번 파일 다운로드 중....");
			
			//현재 스레드를 0.5초간(500ms) 잠재우기
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			//강제로 시간이 걸리는 느낌을 가지도록..
//			for(int k=0; k<2000000000; k++) {
//				new String("aaa");
//				new String("aaa");
//				new String("aaa");
//				new String("aaa");
//			}
		}
	}
}
//음악 재생 작업을 수행하는 직원 클래스 - Thread의 능력을 가진...
class ThreadB extends Thread{
	@Override
	public void run() {
		for(int i=0; i<20; i++) {
			String name= Thread.currentThread().getName();
			System.out.println(name+" : " + i+"번 음악 재생~~");
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
//			for(int k=0; k<2000000000; k++) {
//				new String("aaa");
//				new String("aaa");
//				new String("aaa");
//				new String("aaa");
//			}
		}		
	}
}
public class Main1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// Thread(스레드) : 동시에 여러 작업을 처리하는 기법
		//1. Process : 실행중인 하나의 자바 프로그램 [ 본인만의 메모리영역을 가짐(Method, Stack, Heap)] - 프로세스간에는 자원공유 불가
		//2. Thread  : 하나의 프로세스안에서 동작하는 일꾼(직원)같은 개념 - 하나의 프로세스안에서 스레드간에는 자원공유 가능
		
		// 즉, Thread는 작성되어 있는 코드를 읽어서 실행하는 녀석으로 생각하면 됨.
		// 하나의 프로세스에는 적어도 하나의 스레드가 기본적으로 존재하며 이 스레드를 Main Thread 라고 부름(사장같은 개념)		
		// Main Thread가 혼자서 위 코드를 읽어서 실행하기에
		// 동시에 실행되지 않고 차례대로 실행됨.
		
		// 동시에 하려면? 별도의 직원(Thread의 능력을 가진)객체가 필요함
		// 이 직원이 해야할 작업(Task)을 작성해놓은 클래스를 설계
		// 직원채용 - Thread 객체 생성
		ThreadA a= new ThreadA();	
		//스레드의 run()메소드 실행은 반드시 start()라는 명령으로 실행해야 함
		a.start(); //자동 run()메소드가 발동함
		
		ThreadB b= new ThreadB();
		b.start();
		
		//Main Thread도 별도의 작업을 동시에 수행하고 싶다면.
		for(int i=100; i<120; i++) {
			String name= Thread.currentThread().getName();
			System.out.println(name+" : " + i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

	}//main method..
	
}//Main class..

메인 스레드에도 작업을 추가하면 총 3개의 스레드가 작업을 수행하는것도 볼 수 있음

'JAVA' 카테고리의 다른 글

Synchronized기능과 예제  (0) 2023.07.19
Runnable  (0) 2023.07.19
Collection 클래스들 - Map  (0) 2023.07.18
Collection 클래스들 - Set  (0) 2023.07.18
Colletion 클래스들 - List  (0) 2023.07.18