본문 바로가기

Study/Java

Java18_멀티스레드

728x90

[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 객체를 생성하는 것입니다.

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