[java] 쓰레드(Thread)

쓰레드

 

용어정리

- 프로그램 : 실행 가능한 파일

- 프로세스 : 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()
스레드가 여러개 있다는 것은 콜스택이 여러개 있는것과 같다. 각각의 콜스택은 각 스레드가 종료될 때까지 개별로 살아있게 된다. 즉, 각각의 스레들은 자신만의 작업을 독립적으로 실행할 수 있다. 

- start()를 호출하면 그 스레드를 위한 콜스택이 생성된다. 그러나 run()를 실행하면 기존의 콜스택에 올라가게 된다.(run()을 호출하는 것은 생성된 스레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드 하나를 호출하는 것.)

 

Priority - 스레드마다 우선순위를 지정해줄 수 있다. 범위는 1(최소)~10(최대)이다. 그러나 절대적인 것은 아니며 JVM에게 요청하는 것이며 확률을 높이는 방법인것이다, 상대값이다. 다른 스레드와 비교해서 결정한다.

 

스레드 그룹(==트리구조 생각하면 편할듯. 하위 그룹 존재)

 

데몬스레드 (자식쓰레드, 부모쓰레드가 죽으면 같이 죽는다.)

- 일반 스레드의 보조적인 역할을 수행한다.

- 무한 루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

- setDaemon()을 통해 관계를 맺어준다. 이 함수를 호출한 쓰레드가 부모 쓰레드가 된다.

 

sleep() - 작업 중이더라도 물러나며 선택받을 수 있는 후보에서도 물러난다. 중단되었다 다시 실행될때는 그 아래 명령문부터 시작한다.

 

스레드의 상태

Object에서 notify(), wait()제공. Runnable나 Thread를 이용하지 않고도 쓰레드 관리가 가능하다.