Programming (465) 썸네일형 리스트형 멀티 스레드(3) - 스레드 우선순위 2 앞서서 살펴본 스레드 스케줄링은 두 가지 방식이 있습니다. (1) 우선순위 (Priority) 방식과 (2) 순환 할당(Round-Robin)이죠. 우선순위 방식은 말 그대로, 할당된 우선 순위에 따라 우선순위가 높은 스레드가 실행 상태를 더 많이 가져가는 것입니다. 순환 할당 방식은 시간 할당량(Time Slice)을 배분하고 정해진 시간만큼 실행한 다음 다시 다른 스레드를 실행하는 방식을 의미합니다. 여기서 우선순위 방식은 직접 우선순위 부여가 가능하므로 직접 코드로 제어가 가능하지만, 순환 할당 방식은 가상 머신에 의해 컨트롤되고 정해지는 방식으로 코드 제어가 불가능하다는 점을 기억해야 합니다. 우선순위는 1~10까지 부여됩니다. 주의할 점은 우선순위는 10이 가장 높고, 1이 가장 낮.. 멀티 스레드(3) - 스레드 우선순위 1 스레드에 있어서 '우선순위'개념은 왜 필요한 것일까요? 우선, 기본적으로 하나의 코어에서는 하나의 스레드를 실행한다고 이해하면 되겠습니다. 이 때, 코어의 개수에 따라서 동시성(Concurrency) / 병렬성(Parallelism)을 갖게 됩니다. 여기서 "동시성"과 "병렬성"의 개념적 차이는 무엇일까요? 대표적인 설명을 들자면, 이는 싱글 코어와 멀티 코어의 차이로 생각하시면 되겠습니다. [동시성]은 하나의 코어에서 멀티 스레드가 번갈아 실행되는 성질을 의미합니다. [병렬성]은 말 그대로 멀티 코어에서 각각의 스레드를 동시에 실행하는 성질을 의미하게 됩니다. 즉, 싱글 코어에서는 멀티 스레드 작업이 실제로는 병렬로 실행되는 것은 아닙니다. 번갈아 작업하는 동시성 작업이 워낙 빨라서 사람에게는 병럴.. 멀티 스레드(2) - 작업 스레드 개념 : 스레드 이름 설정/호출 우리가 사용하게 되는 스레드(메인, 작업 스레드)들은 각각 이름을 갖습니다. 이름 자체가 클래스나 메서드처럼 아주 중요한 역할까지 하는 것은 아니지만, 디버깅 과정이라든지 여러 방면에서 작업을 어떻게 진행하는지 확인하는 목적으로 사용되기도 합니다. 기본적으로 메인스레드는 "main"이며, 우리가 생성하는 작업 스레드는 "Thread-n"(n은 스레드 번호)이라는 이름을 갖게됩니다. 여기서 Thread-n 대신에 다른 이름을 설정하고 싶다면 Thread 클래스의 메서드 setName( ), 그리고 getName( )을 사용하면 됩니다. thread.setName("thread name");thread.getName(); setName( )과 getName( )은 Thread의 인스턴스 메서드이므로, .. 멀티 스레드(2) - 작업 스레드 개념 : Thread 하위 클래스로부터 생성 2 이제 우리가 앞선 아티클에서 Runnable을 생성해 만들었던 비프음+"띵~" 텍스트 출력 예제를 Thread 하위 클래스를 이용해서 구현해 보겠습니다. // BeepTask.javaimport java.awt.Toolkit;public class BeepThread extends Thread { @Override public void run() { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i = 0; i 위에서는 Runnable을 구현하는 클래스가 아닌 Thread를 상속하는 클래스로 선언했습니다. 그리고나서 run( ) 메서드를 오버라이드 해서 작업내용을 선언했습니다. 이제 이 BeepThread 클래스를 사용해서 실행을 진행해 보겠습.. 멀티 스레드(2) - 작업 스레드 개념 : Thread 하위 클래스로부터 생성 1 앞선 아티클까지 우리는 작업(워커) 스레드가 실행한 작업을 Runnable 인터페이스를 통해서 선언했습니다. 그리고 이 구현 객체를 Thread 생성자의 파라미터로 전달했지요. 이번에는 작업 스레드가 실행할 작업 내용을 Runnable을 사용하지 않고, Thread의 하위 클래스를 통해 작업 스레드를 정의하는 방법을 알아보겠습니다. 작업 스레드 클래스는 우선 Thread 클래스를 상속하고 run 메서드를 오버라이딩해서 스레드가 실행할 코드를 선언해주면 됩니다. 그리고나서 Thread 객체를 선언할 때 (Thread의 자식 클래스인) 작업 스레드 클래스를 대입해주면 됩니다. 앞의 아티클에서는 Runnable을 Thread 객체 선언 시 파라미터로 전달하는 것이 주요 포인트였죠? 워커 스레드를 선언하는 .. 멀티 스레드(2) - 작업 스레드 개념 : Thread 클래스로부터 생성 2 앞서서 작업 스레드를 사용하지 않고 비프음을 내는 예제를 살펴보았었습니다. import java.awt.Toolkit;public class ExampleMain { public static void main(String[] args) { Toolkit toolkit = Toolkit.getDefaultToolkit(); for(int i = 0; i 위의 예제는 [메인 스레드]만을 사용한 예제라는 것을 이제 이해하셨을 겁니다. 위와 똑같은 작업을 [작업 스레드]까지 사용해서 비프 사운드와 텍스트 "띵~"이 동시에 출력되도록 만들어 보겠습니다. // BeepTask.javaimport java.awt.Toolkit;public class BeepTask implements Runnabl.. 멀티 스레드(2) - 작업 스레드 개념 : Thread 클래스로부터 생성 1 앞선 아티클에서 우리는 Thread 클래스로부터 작업 스레드를 선언하는 방식을 살펴보았습니다. 일단 기본적으로 Thread 클래스를 사용해서 작업 스레드 인스턴스를 생성해야 하는데, 이 때 호출하는 생성자는 인터페이스 Runnable을 파라미터로 갖습니다. Runnable이란 네이밍에서 우리는 이것이 '작업 스레드가 실행할 수 있는 코드'를 갖고 있다는 점을 유추하면 되겠습니다. Thread thread = new Thread(Runnable target); 여기서 인터페이스 Runnable은 메서드 run( )이 선언되어 있습니다. 즉, Runnable 구현 클래스는 run( )을 오버라이드해서 작업 스레드가 실행할 실제 코드를 선언해줘야 합니다. 여기서 Runnable 구현 클래스는 작업 내용만 .. 멀티 스레드(1) - 멀티 스레드 개념 : 프로세스와 스레드 2 기본적으로 JAVA의 어플리케이션은 메인 스레드(main thread)가 main() 메서드를 실행하면서 시작됩니다. 당연하지만 main() 메서드의 코드를 순차적으로 실행해서 마지막 코드 또는 return문을 만나면 실행을 종료하게 되죠. 그런데 여기서 메인 스레드가 필요에 의해서 병렬로 작업 스레드를 통해 코드를 실행할 수 있습니다. 이것이 멀티 스레드를 생성해 진행하는 멀티 태스킹입니다. 위의 그림과 같이 메인 스레드가 메인 스레드가 작업 스레드 1을 생성하고 실행한 다음, 작업 스레드 2를 또하나 생성해 실행하는 방식이 되겠네요. 싱글 스레드 어플리케이션에서는 스레드는 메인 스레드 하나밖에 없습니다. 그래서 메인 스레드가 종료되면 어플리케이션 자체가 종료됩니다. 하지만 멀티 스레드는 다르죠... 이전 1 2 3 4 5 6 7 8 ··· 59 다음