☕️ Java/기본

쓰레드의 동기화 멀티쓰레드 프로세스의 경우에는 여러 쓰레드가 같은 프로세스 내의 자원을 공유합니다. 이로 인해 하나의 쓰레드의 작업이 다른 쓰레드에 영향을 주게 됩니다. 이러한 이유로 발생하는 여러 오류를 방지하기 위하여 한 쓰레드가 특정 작업을 끝마치지 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요합니다. 이를 위해 도입된 개념이 바로 임계영역(critical section)과 잠금(락, lock)입니다. 쓰레드 동기화(synchronization) 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정한 후, 공유 데이터가 각지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 합니다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 l..
쓰레드의 실행제어 멀티쓰레드 프로그래밍은 동기화(synchronization)와 스케줄링(scheduling) 등의 여러가지 이유로 어렵습니다. 앞서(https://ttl-blog.tistory.com/791) 우선순위를 통한 쓰레드간의 스케줄링을 하는 방법을 간단히 살펴보았으나, 이것만으로는 너무 부족합니다. 이제부터 우선순위 이외에도 쓰레드의 스케줄링과 관련된 메서드들을 살펴보도록 하겠습니다. sleep - 일시정지 static void sleep(long millis) 지정된 시간 동안 쓰레드를 일시정지시킵니다. 지정된 시간이 지난 이후에는 자동으로 실행대기 상태로 변환됩니다. sleep은 항상 현재 실행 중인 쓰레드에 대해 작동합니다. 이러한 이유로 static으로 선언되어 있으며, 참조변수를 이..
데몬 쓰레드 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드를 의미합니다. 여기서 일반 쓰레드란 데몬 쓰레드가 아닌 다른 쓰레드를 의미합니다. 데몬 쓰레드는 단지 일반 쓰레드의 보조 역할만을 수행하므로 일반 쓰레드가 작업을 마치고 종료되었다면 데몬 쓰레드는 남은 작업이 있더라도 그 즉시 종료됩니다. 이외 특성은 일반 쓰레드와 모두 동일합니다. 데몬 쓰레드의 예시로는 GC등이 있습니다. 데몬 쓰레드의 작성 데몬 쓰레드는 기본적으로 무한루프와 조건문을 이용하여 실행 후 대기하다가, 특정 조건이 만족되는 순간에 작업을 수행하고 다시 대기하도록 작성합니다. 데몬 쓰레드의 생성과 실행방법은 일반 쓰레드와 모두 동일하지만, 데몬 쓰레드를 실행하기 전에 setDeamon( true )를 호출하여 데몬 쓰레..
쓰레드의 우선순위 우선순위란 이름 그대로 우선적으로 처리해야할 순서를 정해주는 것입니다. 쓰레드에는 우선적으로 처리해야 하는 작업에 대해 우선순위 속성을 부여할 수 있습니다. 우선순위의 값이 클수록 우선순위가 높아 먼저 처리됩니다. 우선순위는 최대 1~10 사이 범위의 정수입니다. 쓰레드의 우선순위 부여 방법 setPriority ( int newPriority ) setPriority를 통해 쓰레드의 우선순위를 부여할 수 있으며, 우선순위는 getPriority()를 통해 알아볼 수 있습니다. 쓰레드의 우선순위 변경은 start()를 호출하기 전에만 가능하며, 호출한 이후에는 우선순위를 바꾸더라도 아무런 영향이 없습니다. 메인 쓰레드의 우선순위 메인 쓰레드는 5라는 우선순위를 가집니다. 우선순위는 쓰레..
이번 글에서는 실제 코드를 통해 싱글쓰레드와 멀티쓰레드에 대해 알아보도록 하겠습니다. 두 개의 작업이 있습니다. 해당 작업을 하나의 쓰레드로 처리하는 경우와 두 개의 쓰레드로 처리하는 경우를 가정하도록 하겠습니다. 하나의 쓰레드로 두 개의 작업을 처리하는 경우에는 한 작업을 모두 마친 후에 다른 작업을 시작하지만, 두 개의 쓰레드로 작업하는 경우에는 짧은 시간동안 2개의 쓰레드가 번갈아가며 작업을 수행하기에, 동시에 두 작업이 처리되는 것과 같이 느끼게 됩니다. 싱글 코어에서 하나의 쓰레드로 두 개의 작업을 실행한 시간과 두개의 쓰레드로 두개의 작업을 수행한 시간을 비교해 보면 거의 동일하지만, 미약하게나마 두 개의 쓰레드로 작업한 시간이 하나의 쓰레드로 작업한 시간보다 더 걸립니다. 이유는 쓰레드간의 ..
쓰레드 구현 자바에서 쓰레드를 구현하기 위햐서는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현해야 합니다. 두 방법 사이의 차이가 없으나 자바는 다중 상속을 지원하지 않기 때문에 유연성의 관점에서 Runnable 인터페이스를 구현하여 사용하는 방법이 더 좋습니다. 예시 코드는 다음과 같습니다. public class Example { static class MyRunnableImpl implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + " Start!!"); } } public static void main(String[] args) { new Thr..
이번 글에서는 쓰레드를 학습하기 전에 프로세스에 대해서 간단하게 알아보도록 하겠습니다. 프로세스 (Process) 실행 중인 프로그램을 의미합니다. 프로그램을 실행하면 OS(운영체제)로부터 실행에 필요한 자원을 할당받아 프로세스가 됩니다. 프로세스는 프로그램을 수행하는 데 필요한 데이터, 메모리 등의 자원과 쓰레드로 구성되어 있습니다. 쓰레드 (Thread) 프로세스의 자원을 이용해서 실제로 작업을 수행하는 주체입니다. 따라서 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재합니다. 하나의 쓰레드를 가진 프로세스를 싱글쓰레드 프로세스(Single-Threaded Process), 두 개 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스(Multi-Threaded Process) 라고 합니다. 멀티태스..
Double Dispatch를 학습하기 전 Method Dispatch가 무엇인지 잘 모르신다면 아래 글을 참고해주세요. https://ttl-blog.tistory.com/776 [Java] Method Dispatch란? (Static, Dynamic) Method Dispatch 어떤 메소드를 호출할 것인가를 결정하고 실행하는 과정을 의미합니다. Method Dispatch의 종류에는 Static Method Dispatch와 Dynamic Method Dispatch가 있습니다. Static Method Dispatch 컴파.. ttl-blog.tistory.com Double Dispatch Dynamic Method Dispatch를 2번 한다는 의미입니다. Dynamic Method Disp..
말 랑
'☕️ Java/기본' 카테고리의 글 목록 (2 Page)