쓰레드
용어정리
- 프로그램 : 실행 가능한 파일
- 프로세스 : os상에서 실행 중인 프로그램(메모리), 데이터(메모리) 공간, 자원
- 쓰레드 : 프로세스 내에서 작업하는 녀석(=메서드, JVM이 main 쓰레드를 호출 main이 메모리릴 오가며 작업한다.)
- 멀티쓰레드 : 하나의 프로세스에서 두 개 이생의 쓰레드가 작동하는 것
- 멀티태스킹 : os상에 올라온 프로세스가 두 개 이상인 상태를 일컫는다.(그외 지식 : 시분할 운영체제 수업들었던거 기억해봐랑)
쓰레드 == scv
- 쓰레드가 하나면 하나의 작업만 가능하다. 여러 작업을 동시에 하고 싶으면 두 개 이상의 쓰레드를 준비하여야 한다.
- 다수의 클라이언트를 사용할 때에도 멀티쓰레드를 사용한다.
장, 단점
책봐
구현과 실행
- 쓰레드 클래스를 상속받는 방법 -> 다른 클래스를 상속받을 수 없다. 쓰레드 클래스의 run()을 오버라이딩해서 사용한다.
- Runnable 인터페이스를 구현하는 방법 -> 다른 클래스를 상속받을 수 있으므로 일반적으로 Runnable인터페이스를 구현한다. Runnable 인터페이스의 추상메서드 run()을 구현하여 사용한다.(ㄱ.또한 Runnable인스턴스 생성 -> Thread클래스의 인스턴스를 생성할 때 매개변수로 제공)
class ThreadEx01_1 extends Thread{
public void run(){
for(int i=0;i<10;i++)
System.out.println(getName());
}
}
class ThreadEx01_2 implements Runnable{
public void run(){
for(int i=0;i<10;i++) // currentThread() - 현재 실행중인 Thread를 반환한다.
System.out.println(Thread.currentThread().getName());
}
}
public class ThreadEx01 {
public static void main(String[] args) {
ThreadEx01_1 t1 = new ThreadEx01_1();
// ㄱ.
Runnable r = new ThreadEx01_2();
Thread t2 = new Thread(r);
t1.start();
t2.start(); // 너님 착각 ㄴㄴ t2는 Runnable 구현한 클래스 따라서 저 위run()이랑 start()를 호출하면서 실행되는 run()이랑 다룸
}
}
실행결과
Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-1Thread-0Thread-
=> main스레드 내에서 메서드를 호출할 때 메서드의 작업이 완료 되어야만 다음 명령문을 실행하였는데 스레드의 경우 완료의 상관없이 각각 실행되어지며 자신의 작업이 끝나야만 종료된다.(병행처리 <=> 순차처리)
- start()를 호출하면 그 스레드를 위한 콜스택이 생성된다. 그러나 run()를 실행하면 기존의 콜스택에 올라가게 된다.(run()을 호출하는 것은 생성된 스레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드 하나를 호출하는 것.)
Priority - 스레드마다 우선순위를 지정해줄 수 있다. 범위는 1(최소)~10(최대)이다. 그러나 절대적인 것은 아니며 JVM에게 요청하는 것이며 확률을 높이는 방법인것이다, 상대값이다. 다른 스레드와 비교해서 결정한다.
스레드 그룹(==트리구조 생각하면 편할듯. 하위 그룹 존재)
데몬스레드 (자식쓰레드, 부모쓰레드가 죽으면 같이 죽는다.)
- 일반 스레드의 보조적인 역할을 수행한다.
- 무한 루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
- setDaemon()을 통해 관계를 맺어준다. 이 함수를 호출한 쓰레드가 부모 쓰레드가 된다.
sleep() - 작업 중이더라도 물러나며 선택받을 수 있는 후보에서도 물러난다. 중단되었다 다시 실행될때는 그 아래 명령문부터 시작한다.
스레드의 상태
Object에서 notify(), wait()제공. Runnable나 Thread를 이용하지 않고도 쓰레드 관리가 가능하다.
'예전 포스팅 모음' 카테고리의 다른 글
[DB] 오라클 구조, sqlplus.exe 사용법, 테이블 생성, 레코드 추가 (0) | 2014.09.18 |
---|---|
[DB] RDBMS(Relationship Database management System, 관계형 데이터베이스)란? (0) | 2014.09.18 |
[java] String (0) | 2014.09.05 |
[java] FileInputStream과 FileOutputStream 사용 예제 (0) | 2014.08.26 |
[java] break문을 사용하지 않고 switch문을 사용한 예제 (0) | 2014.08.25 |