#####. Thread
###. multi Thread
#. 스레드는 실행중인 프로그램을 구성하는 작은 실행 단위로 실행중인 하나의 프로그램은 여러 개의 스레드로 구성될 수 있다. 스레드를 생성하고 실행하기 위한 기본 방법과 스레드를 제어하는 방법에 대해 알아보자. 스레드는 게임 프로그래밍 등에 응용 될 수 있는 고급 프로그래밍 기법이다.
###. 프로세스 / 스레드
#. 실행중인 프로그램을 프로세스(process)라고 하며 모든 프로그램은 기본적으로 프로세스 단위로 실행
#. 프로세스란 프로그램의 통상적인 실행 단위
#. 예를들어 웹 브라우저를 실행하거나 탐색기를 실행하면 각각이 하나의 프로세스가 되어 CPU를 통해 실행
#. 개별 프로세스는 서로 독립적으로 실행되고 실행에 관련된 정보도 서로 독립적으로 관리
#. 한 번에 여러개의 프로세스가 실행되는 것을 멀티 프로그래밍 또는 멀티 태스킹이라고 함.
#. 윈도우 운영체제와 유닉스 계열의 운영체제는 모두 멀티 태스킹을 지원
#. 동시 실행이란 말은 같은 시각에 서로 다른 프로그램이 완벽하게 동시에 실행되는 것을 의미하는 것이 아니라, 프로그램을 실행 시키는 열할을 담당하는 컴퓨터 시스템의 CPU는 통상적으로 한 개 이기 떄문에 엄밀한 의미의 동시실행은 사실상 불가능
#. 운영체제는 시분할 기법과 같은 다양한 기법을 이용하여 동시 실행하는 것 같은 효과를 줌
###. 스레드
#. 스레드는 단위
#. 스레드는 프로세스처럼 하나의 독립적인 프로그램이 실행되는 것이 아니라 프로세스 내의 작은 실행 단위
#. 스레드란 프로세스 내부에서 생성되는 소규모의 실행 단위이며 하나의 스레드는 또다른 스레드를 생성할 수 있다.
#. 프로세스는 하나의 스레드로 구성되거나 여러개의 스레드로 구성될 수 있다.
#. 자바 프로그램을 실행하면 자동으로 스레드 하나가 생성되고, 그 메인 스레드 내에서 main() 메서드를 호출하여 저바는 모두 하나의 스레드로 이루어진 프로세스라 할 수 있다.
#. 멀티 스레드 프로그래밍이란 하나의 프로세스에서 여러개의 스레드가 동시에 실행되도록 하는 것을 의미
#. 스레드는 프로세스를 구성하는 작은 실행 단위이므로 하나의 프로세스에서 여러개의 스레드가 동시에 실행되기도 하고 여러 프로세스를 통해서 여러 개의 스레드가 실행되기도 한다.
#. 모든 스레드에는 우선순위가 있는데 스레드의 우선순위란 여러개의 스레드가 동시에 CPU를 얻어 실행하고자 할 떄 그 순서를 정하는 기준이 되는 값을 말한다.
#. 우선순위가 높은 스레드가 먼저 CPU를 얻어 실행되고 낮은 스레드는 그 다음 얻게 된다.
#. 우선순위가 스레드 실행의 일반적인 순서를 정하기는 하지만 그것은 스레드 실행의 절대적 순서를 의미하지는 않느다.
#. 우선순위가 높은 스레드가 우선 순위가 낮은 스레드보다 항상 먼저 실행되는 것은 아니다.
###. Thread Class
#. Thread 클래스는 스레드 생성의 기본이 되는 클래스
#. 클래스에 정의되는 값
- static int MAX_PRIORITY : 우선순위 최대값
- MIN, NORM
#. 주요 생성자
- Thread(), Thread(String name)
- Tread(Runnable target), Tread(Runnable target, String name)
- Thread(ThreadGroup group, Runnable target, String name)
#. 주요 메서드
- void checkAccess() : 현재 실행중인 스레드가 this 스레드를 제어할 권한이 있는지 알려줌
- static Thread currentThread() : 현재 실행중인 스레드 객체의 참조 값을 리턴
- String getName() : this 스레드의 이름을 리턴
- void setNAme(String name) : this 스레드의 이름을 변경
- int getPriority () : 스레드의 우선순위를 리턴
- void start() : this 스레드를 실행시킨다.
- static void yield() : 현재 실행중인 스레드를 일지거으로 멈추게 해서 다른 스레드가 실행되도록 한다.
- static void sleep(long millis) : 현재 스레드를 mills 시간 동안 잠시 멈추게 한다.
#. Thread 클래스에 정의된 메서드 중에는 Object 클래스의 메서드와 연관이 있는 것이 많다. Object 클래스에 정의된 메서드 중에서 스레드와 관련이 있는 메서드를 나열하면 다음과 같다. Object 클래스에 정의된 메서드는 자바 프로그램의 모든클래스에서 사용이 가능하다.
- void wait()
- boid notify() : wait()를 호출하고 대기중인 스레드 하느 혹은 모드를 깨운다.
###. 스레드 생성
#. 스레드는 프로세스 안에서 생성되며 하나의 스레드는 또 다른 스레드를 생성 시킬 수 있다.
#. 스레드를 생성시킬 떄는 자바가 제공하는 Thread 클래스를 이용하거나 Runnable 인터페이스를 이용하는 방법이 있다.
#. 스레드를 생성하려면 Thread 클래스를 상속 받는 클래스를 정의하거나 Runnable 인터페이스를 구현하는 클래스를 정의한다.
#. Thread 클래스는 실제로 Runnable 인터페이스를 구현하는 클래스로 정의 되어있다.
#. 자바에서는 다중 상속을 지원하지 않으므로 Thread 클래스 상속 받도록 정의하면 다른 클래스를 상속 받을 수 없다.
#. 다른 클래스를 상속 받으면서 스레드가 되게 하려면 Runnable 인터페이스를 구현하도록 정의 해야 한다.
#. Runnable 인터페이스로 생성하는 소스
class MyThread implements Runnable{
public void run (){syso ("Thread");}
public class RunableEx{
main -----------------------------
Thread myThread = new Thread(new myThread());
myThread.strart();
}
###. Thread 상태
#. 스레드는 생성되고 실행된 다음 소멸하기 전까지 다양한 상태를 거친다.
#. 스레드는 객체가 생성되고 생성된 객체를 통해 start() 메서드가 호출되면서 동시에 생성된다.
#. 생성된 스레드는 run()메서드를 실행시키고 run() 메서드가 끝나면 스레드도 종료되어 소멸된다.
#. 스레드가 실행된다는 것은 CPU자원을 얻어 사용한다는 뜻
#. 스레드의 실행은 CPU에서 이뤄지고 보통 CPU는 한 개만 있기 때문에 start() 호출로 스레드가 생성된다고 해서 바로 run () 메서드가 실행되는 것은 아니다. 왜냐면 스레드가 생성된 시점에 CPU를 다른 스레드가 사용할 수 있기 떄문
#. 스레드의 상태를 알아보는 메서드
- Startable
- Runnable
- Running
- Not Running
- Dead
###. 쓰레드 제어
#. 쓰레드를 제어한다는 말은 쓰레드 상태를 변경시킨다는 뜻
#. Start()
#. wait()
#.sleep()
#. join()
###. 스레드 동기화
#. 동시에 실행되는 서로 다른 스레드 간에 공유되는 객체에 대해 일관성을 유지하는 것
#. 공유하는 하나의 객체에 대해 데이터의 무결성이 유지되어야 한다는 것.
#. 하나의 변수 a를 A, B라는 두 개의 스레드가 같이 사용하는 경우 마닝ㄹ A스레드가 a의 값을 하나 증가시켯다면 B스레드에서도 하나 증가된 변수를 a를 참조해야 하는 것이 스레드의 동기화
###. 스레드의 간섭
#. 하나의 자원을 공유하는 여러 스레드 간에 동기화를 하지 않으면 간섭 형상이 발생
#. 공유 자원의 일관성이 깨지는 것
'IT_Term' 카테고리의 다른 글
[IT_Term] java_JDBC프로그래밍_방통대 교재 정리 (0) | 2023.06.10 |
---|---|
[IT_Term] Java AWT(Abstract Windows Toolkit)_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] java_collection,hasSetMap,arryList_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] java.nio(new input output).pakage_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] Java.io.Stream_방통대 교재 정리 (1) | 2023.06.09 |