티스토리 뷰

※ 프로세스

: 실행 중인 하나의 프로그램이다.

하나의 프로그램은 다중 프로세스를 만들기도 한다.

 

하나의 프로세스 내부에서 멀티테스킹 할 수 있다. 

하나의 프로세스에 스레드가 있다.

 

※  멀티 테스킹 (multi tasking)

- 두 가지 이상의 작업을 동시에 처리하는 것 

- 멀티 프로세스 : 독립적으로 프로그램들을 실행하고 여러 가지 작업 처리
- 멀티 스레드 : 한 개의 프로그램을 실행하고(-> 그 프로세스의 )내부적으로 여러 가지 작업 처리 


※  메인 스레드 : 코드의 실행 흐름 

- 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작된다.

- main() 메소드의 첫 코드부터 아래로 순차적으로 실행한다. 

- main() 메소드의 마지막 코드를 실행하거나, return 문을 만나면 실행이 종료된다. 

- main() 스레드는 작업 스레드들을 만들어서 병렬로 코드들을 실행할 수 있다. 

즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다. 

 

▶ 프로세스의 종료

  • 싱글 스레드 : 메인 스레드가 종료하면 프로세스도 종료된다.
  • 멀티 스레드 : 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다. 
  • 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않는다.

▶ 스레드 생성과 실행 방법 2가지 

1. Thread 클래스로부터 직접 생성

자바 도큐먼트

- 자바에서 Thread도 객체이다.

- 자바 도큐먼트에서 Thread 클래스를 찾아보면 생성자에서 Runnable 매개변수를 알 수 있다.

Runnable 은 인터페이스이고, 내부에 run() 메소드가 있다. 

따라서, 스레드 클래스를 만들려면 Runnable 인터페이스로 사용가능한 클래스를 생성해서 

run() 메소드를 재정의(오버라이드) 하여 실행 흐름을 구현하면 된다. 

 

[실습]

package pr12.exam01;

public class Example {

	public static void main(String[] args) {
		System.out.println("메인 스레드 시작");
		
		// 네트워크 작업을 하는 스레드 생성과 실행
		// 1. 쓰레드 호출하는 첫 번째 방법 
		Thread thread1 = new Thread(new NetworkTask());
		thread1.start(); // start()를 호출하면 run()을 실헹한다.
		
		
		// 뮤직 작업을 하는 스레드 생성과 실행 
		Thread thread2 = new Thread(new MusicTask());
		thread2.start();
		
		// 채팅 작업을 하는 스레드 생성과 실행 , 익명 구현 클래스 이용 해서 익명 구현 객체 생성 
		// 러너블 인터페이스를 구현해서 클래스를 만들어서 그걸로 객체를 만들겠다. 
		Thread thread3 = new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					System.out.println("채팅 작업을 합니다.");	
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						//e.printStackTrace();
					}
				}
			}
			
		});
		thread3.start();
		
		while(true) {
			System.out.println("메인 스레드 종료");
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				//e.printStackTrace();
			}
		}
		
	}

}


// 다른 파일 
package pr12.exam01;

public class MusicTask implements Runnable{

	@Override
	public void run() {
		while(true) {
			System.out.println("음악을 연주 합니다.");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				//e.printStackTrace();
			}
		}
	}
	
	

}

 

2. Thread 하위 클래스로부터 생성

- Thread 클래스를 상속받아서 생성. 그 자체로 쓰레드 클래스가 된다. 

 

[실습]

 

package pr12.exam02;

public class Example {

	public static void main(String[] args) {
		System.out.println("메인 스레드 시작");

		// 네트워크 작업을 하는 스레드 생성과 실행
		Thread thread1 = new NetworkTask();
		thread1.start(); // start()를 호출하면 run()을 실헹한다.

		// 뮤직 작업을 하는 스레드 생성과 실행
		Thread thread2 = new MusicTask();
		thread2.start();

		// 채팅 작업을 하는 스레드 생성과 실행 , 익명 자식 객체 
		Thread thread3 = new Thread() {
			@Override
			public void run() {
				while (true) {
					System.out.println("채팅 작업을 합니다.");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// e.printStackTrace();
					}
				}
			}

		};
		thread3.start();

		while (true) {
			System.out.println("메인 스레드 종료");

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// e.printStackTrace();
			}
		}

	}

}


// 다른 파일
package pr12.exam02;

public class NetworkTask extends Thread{
	
	@Override
	public void run() {
		while(true){
			System.out.println("네트워크 통신을 합니다.");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				//e.printStackTrace();
			}
		}
	}
	
	

}