기본 콘텐츠로 건너뛰기

자바 쓰레드 관련 정리

자바에서 쓰레드를 사용하는 건 참 쉽죠잉~. 쓰레드 관련 공부한 내용 정리합니다.

쓰레드란 ?  하나의 프로세스 안에서 실제적으로 작업을 처리하는 단위이다

main인 메솓를 실행하는 스레드가 기본적으로 존재한다.

join() 메소드 : 특정한 쓰레드가 실행 된 후에 다른 쓰레드가 실행되도록 제어하는 메소드이다. join()메솓를 호출한 스레드가 끝날때까지 다른 쓰레드는 대기한다.
(여담으로 이름으 join인 이유는, 예전에 프로세스를 fork=분기 해서 복사한 다음에 마칠때는 다같이 합쳐서=join해서 마친다는 의미로 해석하시면 이해하기 편합니다.

쓰레드의 우선 순위가 높으면 CPU를 더 많이 사용할 수 있다. 해야할 작업이 많은 쓰레드의 우선순위를 높여줌으로써 더 많은 작업을 하게 해준다. .setPriority() 메소드를 이용한다.

하나의 자원에 여러개의 쓰레드가 동시에 접근하지 못하도록 동기화 기능이 필요하다. 동기화는 메소드에 synchronized를 붙여서 메소드를 동기화 하는 방법과 클래스에서는 sychronized(this)와 같이 동기화 블럭을 사용하여 클래스 접근의 동기화를 해주는 두가지 방법이 있다.

동기화 기능에 더하여 제어권을 직접적으로 제어할 수 있다면 더 많은 작업을 할 수 있을것이다. 이 제어를 위한 메소드들이 wait(), notify(), notifyAll()이다. 이 메소드드들은 동기화 블럭 안에서만 사용할 수 있다. 참고로 Thread 클래스에서 제공되는 메소드가 아니라 Object 메소드에서 제공되는 메소드 이다. notify(), notifyAll()을 해주면 wait하던 쓰레드가 바로 Running이 되는건 아니고 Runnable상태가 되는 것이다.

Thread 클래스에서 내가 몰랐던 메소드들
void interrupt() : 쓰레드에 인터럽트 생성
void sleep(long millis) : 밀리초 동안 실행 정지
void yield() : 다른 쓰레드에게 CPU 양보

댓글

이 블로그의 인기 게시물

좌표압축

알 고리즘을 풀다 보면 좌표압축이라는 테크닉이 필요합니다. 저는 좌표압축을  "순위가 중요한 알고리즘에서, 입력값의 갯수보다 입력값의 범위가 클 때 사용하는 방법",  이라고 생각하고 있습니다. 1차원의 좌표로 예를 들어보겠습니다. n개의 x값 을 입력 받아, 입력 중 두개의  x1,x2를 선택하여 사이에 존재하는 점의 개수를 구하는 작업이 있다고 가정합시다. x의 범위는 int형의 범위인 -2^31 ~ 2^31-1 이고 중복은 없습니다. n은 5000 이하입니다. 입력은 n : 7, -2^31, -10000, 0 , -2000, 3, 6, 30000 , x1 = -10000, x2 = 30000 대략적으로 보면 그림과 같이 나타나게 됩니다. x1,x2 사이의 값을 구하게 되면 4개의 값이 나오게 됩니다. 이 경우 위의 값들을 아래와 같이 순위를 유지하면서 바꿔주어도 문제를 풀 수가있습니다. 이렇게   바꿔서 풀 수 있는 이유는 값보다 값의 순위가 중요하기 때문 입 니다. 압축좌표가  필요한 예 로, 카카오 코드 페스티벌 5번 캠핑 문제가 될 수 있습니다. 이 경우 좌표  x,y의 범위는 0 ~ 2^31-1  이지만, 입력받는  좌표의 개수는 최대 5000개  입니다. 만약 입력의 좌표를 그대로 반영하여 문제를 푼다고 하면 배열의 크기가 2^31-1 개가 되어야 합니다. 게다가 2차원으로.. 못풉니다. 탐색하다가 시간다 끝날꺼에요. 하지만 입력이 최대의 개수가 최대 5000이라고 했으니 좌표압축을 이용해 입력받은 좌표를 0~5000 으로 매치시키고 풀게되는 것 입니다.