반응형
java
다중 Thread의 이해
-
우리가 사용하는 윈도우와 같은운영체제는 여러개의 프로세스를 동시에 사용할수 있는 멀티프로세스로 동작하고 있다.
스레드는 하나의 프로세스 냐에서 일을 처리하는 세부 실행단위다.
일반적으로 java로 기초적인 문제를 작성하거나프로그램을 만드는것은 단일스레드로 동작하는 프로그램이다.
단일스레드는 헌프로세스에서 하나의 스레드만 가진것인데 반해 다중스레드는 하나의 프로세스에 스레드를가지고 동시에 작업을 수행한다.
스레드의 구현방법은 2가지가 있다.
1. Thread클래스를 상속받는(확잗, extends)이고 두번째 방법은 Runnable인터페이스를 상속받는(구현, implements) 방법이다.
스레드를 살행시키기 위해서는 스레드객체의 start()메소드를 호출함으로써 실행이된다.
start()메소소드를 호출하면 run()메소드가 자동호출이 되는데, run()메소드는 다중스레드로 동작시키고자하는 내용이 기술되어있다.
그러므로 start()메소드를 사용하면 자동적으로 스레드가 실행된다.
*쓰레드와 멀티프로세스의 차이점.
둘다 두가지이상의 작업을 동시에 처리할수 있는 메커니즘이기는 하다.
우선 프로세스는 프로세스를 이루는 몇가지 영역이 있는데 보통 code영역, data영역 , heap영역, stack영역으로 구성이 된다.
이것들이 모여서프로세스를 이루는데 멀티프로세스가 이와같은 프로세스를 통째로 여러개 수행시키는 것이라 한다면 쓰레드는
하나의 프로세스옆에서 프로세스와 같이 수행되는것이 생각하면된다.
쓰레드는 프로세스가 가진 code, data, heap영역을 프로세스와 같이공유한다. 쓰레드는 stack만 따로 가지고 있기 때문이다.
같이 공유하는 영역을 가지다 보니 하나의프로세스에 붙어 있는 여러 쓰레드간 혹은 프로세스와 의 통신에 별다른 부담이 없다.
기본예제-
기본적인 스레드 사용-
일반적으로 java로 기초적인 문제를 작성하거나프로그램을 만드는것은 단일스레드로 동작하는 프로그램이다.
단일스레드는 헌프로세스에서 하나의 스레드만 가진것인데 반해 다중스레드는 하나의 프로세스에 스레드를가지고 동시에 작업을 수행한다.
스레드의 구현방법은 2가지가 있다.
1. Thread클래스를 상속받는(확잗, extends)이고 두번째 방법은 Runnable인터페이스를 상속받는(구현, implements) 방법이다.
스레드를 살행시키기 위해서는 스레드객체의 start()메소드를 호출함으로써 실행이된다.
start()메소소드를 호출하면 run()메소드가 자동호출이 되는데, run()메소드는 다중스레드로 동작시키고자하는 내용이 기술되어있다.
그러므로 start()메소드를 사용하면 자동적으로 스레드가 실행된다.
*쓰레드와 멀티프로세스의 차이점.
둘다 두가지이상의 작업을 동시에 처리할수 있는 메커니즘이기는 하다.
우선 프로세스는 프로세스를 이루는 몇가지 영역이 있는데 보통 code영역, data영역 , heap영역, stack영역으로 구성이 된다.
이것들이 모여서프로세스를 이루는데 멀티프로세스가 이와같은 프로세스를 통째로 여러개 수행시키는 것이라 한다면 쓰레드는
하나의 프로세스옆에서 프로세스와 같이 수행되는것이 생각하면된다.
쓰레드는 프로세스가 가진 code, data, heap영역을 프로세스와 같이공유한다. 쓰레드는 stack만 따로 가지고 있기 때문이다.
같이 공유하는 영역을 가지다 보니 하나의프로세스에 붙어 있는 여러 쓰레드간 혹은 프로세스와 의 통신에 별다른 부담이 없다.
기본예제-
기본적인 스레드 사용-
결과1.
결과2.
위의 다중스레드로 동작하였기때문에 순서없이동시에 동작하여 실행할때마다 결과값이 다르게 나오는것이다.
Thread와 자원공유 -멤버필드
결과
이번 코드 역시 실행시킬때마다 결과값이 틀려진다.
*Lock과 Moniter
우선 Lock은 상호배제락이라 부른다. 그리고 이러한 락에 의해 쓰레드와 공유자원사이의 상호작용을 제어하는 행위를 동기화라 부른다.
쓰레드는 동시에 2가지이상의 흐름을 갖는것을 의미한다. 하지만 문제가 발생되는 경우가 있는데 그중하나가 자원공유에 관한것이다.
---
만약A라는 쓰레드가 M이라는 변수값을 변경한다고 하면 M에는 100이라는 값을 가지고 잇는데 A가 여기에 50이라는 값을 넣으려고 한다.
그렇게 "M + 50"해서 150이라는 값을 얻었다. M에 150이라는 값을 대입하기만 하면되는데 B라는 쓰레드에서 100이라는값을 M에 넣어버렸다.
그러면 B는 200이 된다. 그뒤에 A쓰레드가 가지고 있는 150이라는 값을 M에 대입하였다. 그렇게되면 A는 150 B는 200 인것으로 알고 있지만
B는 150이 들어가있다.
---
쓰레드가 동시에 2개가 돌면서 하나의 자원을 서로 쓰다보니 이러한 현상이 일어난다.
이문제를 해결하기위해서 Lock과 Moniter가 있는것이다.
먼저 모니터는 하나의 쓰레드가 하나의객체에 대한 락을 휙득했을떄 다른쓰레드가 그객체에 접근하여 동시화시킨 영역에 접근하는 행위를
막아준다.
그렇게되면 아까얘기한 A라는쓰레드의 작업이 끝나야만 B라는쓰레드의 작업이 진행되어 올바른 값을 나타낼 수 있다.
Java의 오브젝트에는 Monitor가 할당된다. 이 모니터는 자신을 소유한 쓰레드를 제외한 다른 쓰레드의 접근을 막는다. 이러한 특성을 mutual exclusion 혹은 뮤텍스라고 부른다. 이렇게 모니터는 일시적으로 다른 쓰레드가 외부에서의 접근을 포기하게 만드는 기능을 하는데 만약 쓰레드가 어떤 오브젝트의 락을 획득하면 그 락을 획득한 동기화 영역에는 다른 쓰레드의 접근이 불가하다. 다른 쓰레드가 이 오프젝트의 락을 획득하기 위해서는 이전 쓰레드가 잡고있는 락을 풀어줘야지만 락의 획득이 가능하다. 이는 wait같은 대기모드 함수를 호출하거나 동기화 블록이 끝나는 부분에서 락을 자동으로 해제하게 된다.
< JAVA Whitre Paper 문서에서 발췌 - The most basic of these methods is synchronization, which is implemented using monitors. Each object in Java is associated with a monitor, which a thread can lock or unlock. Only one thread at a time may hold a lock on a monitor. The
synchronized
statement computes a reference to an object; it then attempts to perform a lock action on that object's monitor and does not proceed further until the lock action has successfully completed.>쓰레드 우선순위-
우리가 스레드를 생성하면 기본적으로 스레드는 중간정도의 우선순위를 가진다.
스레드에도 수행순서의 변화를 줄수 있는데 그 값이 MAX_PRIORITY(높은 우선순위), NORM_PRIORITY(중간 우선순위) ,MIN_PRIORITY
(낮은 우선순위)의값을 1~10사이의 값으로 줄수 있다.
상수값을주어 스레드에 우선순위를 변경하기위해서는 setPriority()메소드를 사용해야한다.
기본형식 - void setPriority(int newPriority)
메소드의전달인자로 스레드의 우선권 상수중 하나를 설정한다.현재스레드의 우선순위를 알고자할때 getPriority()메소드를 호출하면 된다.
예제 10_5
결과값
반응형
'School Study' 카테고리의 다른 글
[업무일지]-20100906-임종현 (0) | 2010.09.07 |
---|---|
[업무일지]-2010903 -임종현 (0) | 2010.09.06 |
[업무일지]-20100827 (0) | 2010.08.30 |
[업무일지]-20100826 (0) | 2010.08.27 |
[업무일지]-20100825 (0) | 2010.08.25 |