[Multi Thread 멀티 스레드]
1. 스레드와 멀티 스레드의 개념
‣ 프로그램은 main(); 메소드의 첫 째 명령문부터 시작되어 return; 문을 만나면 종료되는데, 이렇게 하나의 실행 흐름을 갖는 프로그램을 싱글 스레드 프로그램(single thread program)이라고 합니다. 그러므로 main(); 메소드도 하나의 스 레드가 되며 메인 스레드라고 합니다. 이에 비해 멀티 스레드 프로그램(multi thread program)은 메인 스레드 외에 동 시에 실행되는 다른 메소드를 가져야 합니다.
‣ 멀티 스레드 프로그램은 메인 스레드가 시작된 후 메인 스레드가 종료되기 전, 메인 스레드에서 다른 스레드를 시작하게 만들어야 합니다. 그리고 메인 스레드가 끝나더라도 다른 스레드가 끝나지 않으면 프로그램은 종료되지 않고 계속 실행됩니다.
‣ 각 스레드가 실행하는 작업은 별도의 클래스로 작성해야 하며, 멀티 스레드를 작성하기 위해서는 Thread 클래스를 이용 하거나 Runnable 인터페이스를 이용하여 작성할 수 있습니다. cf. Thread 클래스와 Runnable 인터페이스는 java.lang 패키지에 포함되어 있습니다.
[싱글 스레드 흐름]
‣ 스레드 순서
2. Thread 클래스를 이용한 멀티 스레드 프로그램 작성
2-1. 스레드 작성
‣ 예제 프로그램은 다음에 기재된 두 개의 스레드로 구성되어 있습니다.
a. A부터 Z까지 출력 b. 0부터 9까지 출력 작성방법은 오른쪽 그림 내용을 참조합니다. |
2-2. 멀티 스레드 프로그램 코드작성
a. 메인 스레드에 알파벳을 출력하는 프로그램을 작성합니다.
ex1. 메인 스레드 작성 - 미완성된 코드입니다.
b. 멀티 스레드로 실행될 클래스, 즉, 숫자를 출력하는 클래스를 작성합니다.
이 클래스는 java.lang.Thread 클래스를 상속받아야 하며, 실행될 메소드는 public void run(); 이어야 합니다.
ex2. 멀티 스레드
c. 메인 스레드에서 Thread 타입의 변수를 선언하여 멀티 스레드의 객체를 생성한 후
Thread 클래스의 start(); 메소드를 이용하여 멀티 스레드가 동시에 시작하도록 만듭니다.
ex3. 메인 스레드 수정
참고1.
프로그램은 시스템에 의해 스레드들이 아주 짧은 시간간격으로 무작위로 번갈아 실행됩니다. '
그래서 원하는 결과와는 다르게 나올 수 있습니다. 또한 실행 결과가 클수록 그 결과를 예측할 수 없습니다.
그 결과로 알파벳이 모두 출력된 후 숫자가 출력되거나, 그 반대의 일이 발생하거나, 혼재되는 경우가 발생합니다.
참고2.
이런 문제를 해결하기 위해 출력시간을 지연시키는 방법이 있습니다.
2-3. 출력 시간을 지연시키는 sleep(); 메소드의 활용
‣ sleep(); 메소드는 일정 시간 동안 아무것도 실행하지 않고 대기합니다. 인수로 밀리세컨드 단위의 값이 전달되는데, 밀리세컨 드는 1/1000 초 단위이므로 1000이 전달되면 1초간 실행되지 않고 대기합니다.
‣ checked exception인 InterruptedException을 발생시킬 수 있으므로 try-catch문으로 처리해야 합니다.
ex. 메인 스레드와 멀티 스레드의 수정
참고. 출력 결과는 느리지만 상대적으로 더 고르게 섞여서 출력됩니다.
2-4. 여러 개의 스레드를 만드는 멀티스레드 프로그램
‣ 한 개의 클래스를 이용하여 여러 개의 스레드를 생성할 수 있습니다.
ex. 세 개의 스레드 실행
|
3. Runnable 인터페이스를 이용한 멀티스레드 프로그램 작성
3-1. 스레드 작성
‣ 예제 프로그램은 다음에 기재된 두 개의 스레드로 구성되어 있습니다.
a. ㄱ ~ ㅎ 까지 출력 b. a ~ z 까지 출력 작성방법은 오른쪽 그림 내용을 참조합니다. |
3-2. 멀티 스레드 프로그램 코드작성
‣ Runnable 인터페이스를 이용한 멀티스레드 프로그램은 Thread 클래스를 이용한 것과 거의 동일합니다.
차이점은 인터페이스를 구현한 클래스를 객체로 생성한 후, 그 객체를 파라미터로 Thread 객체를 생성하는 것입니다.
a. 멀티 스레드로 실행될 클래스, 즉, 알파벳 소문자를 출력하는 클래스를 작성합니다.
이 클래스는 java.lang.Runnable 인터페 이스를 구현해야 하며, 실행될 메소드는 public void run(); 이어야 합니다.
ex1. 멀티 스레드 작성
b. 인터페이스로 구현된 클래스를 객체로 생성한 후, 그 객체의 인스턴스를 파라미터로 Thread 객체를 생성합니다.
ex2. 메인 스레드
참고.
그러므로 Thread 클래스, Runnable 인터페이스 중에 편한 방식을 선택하면 됩니다.
다만, 클래스의 상속관계에서 다중 상속을 받을 수 없는 경우는 Runnable 인터페이스를 사용해야 합니다.
'Study > Java' 카테고리의 다른 글
객체지향 프로그래밍 6장(6강 ~ 10강) (0) | 2022.06.02 |
---|---|
객체지향 프로그래밍 6장(1강 ~ 5강) (0) | 2022.06.02 |
Java16_컬렉션프레임워크 (0) | 2022.05.14 |
Java15_내장클래스 (0) | 2022.05.14 |
Java14_수식어 (0) | 2022.05.14 |