Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[4주차] 71. Thread, 동시연산이 가능하도록 만드는 쓰레드 사용법(완성) 본문

K-DigitalTraining 강의/1. Java

[4주차] 71. Thread, 동시연산이 가능하도록 만드는 쓰레드 사용법(완성)

이대곤 2022. 6. 3. 11:44

* 쓰레드를 사용함으로써 얻는 효과

쓰레드를 사용하지 않고 서브 메소드를 호출하면 서브 메소드의 작업이 끝날 때 까지 다음 라인으로 넘어가지 않는다. 반면,
서브 메소드를 쓰레드 방식으로 호출하면 서브 메소드는 이거대로 돌아가고 메인 메소드도 이거대로 멈추지 않고 돌아간다.
 따라서 cpu의 사용률을 향상시킬 수 있다.

 

* 특정 메소드를 쓰레드 방식으로 실행시키는 두 가지 방법(공식처럼 암기해두는게 좋음)


1) 첫번째 방법

1. Runnable 인터페이스를 상속받는 클래스를 하나 만들고, 상속받은 미완성 메소드 run()을 오버라이딩하여 완성시켜줌

2. 1번에서 생성한 클래스의 객체를 생성

3. 2에서 생성한 객체를 가리키는 참조변수를 넘겨받아 Thread 클래스의 객체를 생성

4. 3에서  생선한 객체를 이용해서 Thread 클래스의 멤버함수 start()를 호출

=> 이러면 객체 내부의 run 메소드가 자동으로 호출되고, main 메소드도 멈추지 않고 하던일을 계속함 

 

2) 두번째 방법(더욱 간편)

1. Thread 클래스를 상속받는 클래스를 만들고,  상속받은 run() 메소드를 오버라이딩하여 원하는 동작의 코드를 넣어줌

2. 1번에서 생성한 클래스의 객체를 생성한 뒤, 이 객체를 통해 Thread 클래스로 부터 물려받은 start() 메소드를 호출

=> 이러면 객체 내부의 run 메소드가 자동으로 호출되고, main 메소드도 멈추지 않고 하던일을 계속함 

 

* 두 방식의 공통점

- run() 메서드를 정의해줘야 함

- 마지막에 start() 메소드를 호출하여 run()메소드를 간접적으로 호출한다는 점!

  바로 run()을 호출하면 쓰레드 방식이 아닌 일반 방식으로 작동한다는 점에 주의하자.

쓰레드를 사용하지 않고 서브 메소드를 호출하는 코드

- 호출된 서브메소드가 작업을 다 끝날 때 까지 다음 라인으로 넘어가지 않았음

class AA {
	void method() {
		for (int i = 1; i <= 30; i++) {
			System.out.print(i + " ");
		}
	}
}

public class Ex10_01_Thread {
	public static void main(String[] args) {
				
		System.out.println("프로그램 시작");
        
		AA a = new AA();
		a.method(); 	// 호출된 서브 메소드의 동작이 끝나기 전에는 main 메소드는 멈춰있어 다음 코드라인으로 안넘어감
		
		System.out.println("프로그램 종료");	
	}
}
프로그램 시작
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
프로그램 종료

쓰레드를 사용하여 서브 메소드를 호출하는 코드(첫번째 방법 이용)

class AA implements Runnable {

	@Override
	public void run() { // 상속받은 미완성 메소드인 추상 메소드를 완성시킴
		for (int i = 1; i <= 30; i++) {
			System.out.print(i + " ");
		}
	}
}

public class Ex10_01_Thread {
	public static void main(String[] args) {
				
		System.out.println("프로그램 시작");

		AA a = new AA();
		Thread trd = new Thread(a);
		trd.start(); // run 메소드를 호출하는 코드(쓰레드 방식으로 돌아감)
						
		System.out.println("프로그램 종료");	
	}
}
프로그램 시작
프로그램 종료
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

쓰레드를 사용하여 서브 메소드를 호출하는 코드(두번째 방법 이용)

class BB extends Thread { 
	
	@Override
	public void run() { // 상속받은 run() 을 오버라이딩
		for (int i = 1; i <= 30; i++) {
			System.out.print(i + " ");
		}
	}
}


public class Ex10_02_Thread {
	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		
		BB b = new BB();
		b.start();          //Thread 클래스로부터 물려받은 start() 메소드로 run 메소드를 자동으로 호출함	
		
		System.out.println("프로그램 종료");
	}
}
프로그램 시작
프로그램 종료
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Comments