|
|
제목:꽃게
프로세스와 쓰레드
프로세스란? 실행중인 프로그램
프로그램 →실행→ 프로세스
프로세스는 데이터,메모리 자원,쓰레드로 구성
프로세스 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드
프로세스에는 최소한 하나 이상의 쓰레드가 존재
둘이상을 멀티쓰레드,프로세스 라고 한다.
싱글쓰레드 프로세스 = 자원+thread
멀티쓰레드 프로세스=자원+thread+thread....
프로세스가 가질 수 잇는 쓰레드의 개수는 제한되어 잇지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출스택)을 필요로 하기 때문에
프로세스의 메모리 한계(호출 스택의 크기)에 따라 생성할 수 있는 쓰레드의 수가 결정됨
메모리의 한계에 다다를 정도로 많은 쓰레드를 생성하는 일은 거의 없음
대부분의 OS(원도우 등등)은 멀티 태스킹을 지원하기 때문에 여러개의 프르세스가 동시에 실행됨
멀티 쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행 하는것이 가능
실제로는 한개의 cpu가 한 번에 단 한가지 작업만 수행할 수 있기 때문에 아주 짧은 시간동안 여러 작업을 번갈아 가며 수행하는것 그러나 보기에는 동시에 여러 작업을 수행하는 것처럼 보임
프로세스의 성능은 쓰레드의 개수의 비례하지 않음 하나의 스레드가 더 성능이 높을수 있음
차이에 예시
싱글쓰레드=도스 멀티쓰레드=원도우
멀티쓰레드의 장점
1.cpu의 사용률을 향상 시킨다
2.자원을 보다 효율적으로 사용
3.사용자에 대하 ㄴ응답성이 향상
4.작업이 분리되어 코드가 간결
핸드폰의 경우 메세지를 보내면서 노래를 듣고 파일을 받는 행동을 한번에 할수 있는 점과 유사
여러 사용자에게 서비스를 해주는 서버프로그램의 경우 멀티쓰레드로 작성하는 것이 필수적
멀티쓰레드의 단점
프로세스 내에서 자원을 공유 작업으로 인한
1.동기화 오류
2.교착상태에 빠짐
교착상태-두 쓰레드가 자원을 점유한 상태에서 서로 상대평이 점유한 자원을 사용하려고 기다리느라 진행이 멈춘상태
문제를 고려하여 신중히 프로그래밍해야함
쓰레드의 구현과 실행
1.Thread클래스를 상속
class A extends Thread{
public void run(){//내용}
}
2.Runnable인테페이스를 구현-재사용성(reusability)이 높고 코드의 일관성을 유지
class A implements Runnable{
public void run(){//작업내용}
}
두방법에 차이는 없다
단 Thread클래스를 상속받으면 다른 클래스를 상속 받을수 없기 때문에 Runnable인터페이스를 구현하는 방법이 일반적
Runnable인터페이스는 run()메서드만 정의되어 있는 간단한 인터페이스
추상메서드 run()의 몸통을 만들어 주기만 하면됨
public interface Runnable{
public abstract void run();
}
인스턴스 생성방법
ThreadA a=new ThreadA();
Runnable A=new ThreadA();
Thread B=new Thread(A);
//Thread B=new Thread(new ThreadA());
Runnable인터페이스를 구현한 경우
인터페이스를 구현한 클래스의 인스턴스를 생성
인스턴스를 가지고 Thread클래스의 인스턴스를 생성
생성자의 매게변수로 제공
사용되는 Thread클래스의 생성자는 Thread(Runnable target)로 후출시에 Runnable인터페이스를 구현한 클래스의 인스턴스를 넘겨줘야함
public class Thread{
private Runnable R;//클래스의 인스턴스를 참조하기위한 변수 선언
public Thread(Runnable r){
this.r=r;
}
public void run(){
if(r!=null)
r.run(); //Runable인터페이스를 구현한 인스턴스의 run()을 호출한다.
}
}
Thread를 상속받으면 Thread클래스의 메서드를 직접 호출 하지만
Runnalbe을 구현하면 thread클래스의 static메서드인 currentThread()를 호출하여 쓰레드에 대한 참조를 얻어 와야만 호출이 가능
ThreadA a=new ThreadA();
a.getName();호출가능
Runnable A=new ThreadA();
Thread B=new Thread(A);
//Thread B=new Thread(new ThreadA());
Thread.currentThread().getName()과 같이 해야 함
Thread Currentthread()-현재 실행중인 쓰레드의 참조를 반환한다.
String getName()-스레드의 이름을 반환한다.
쓰레드 이름 변경
Thread(Runnable target, String name)
Thread(String name)
void setName(String name)
쓰레드의 이름을 지정하지 않으면 'Thread-번호' 의형식으로 자동 저장
Thread t= Thread.currentThread(0;
String name=t.getName();
System.out.prinln(name);
쓰레드를 생성후 start()를 호출해야만 비로소 작업을 시작함
t.start();
한번 사용한 쓰레드는 재사용x
하나의 쓰레드에 대해 start()가 한번만 호출됨
한 번더 수행 하기를 원한다면 새로운 쓰레드를 생성한 다음에 start()를 호출
ThreadA a=new ThreadA();
a.start();
a.start();// 두번 호출시에는 IllegalthreadStateException이 발생
↓
ThreadA a=new ThreadA();
a.start();
a=new ThreadA();
a.start();// 이런식으로해야 에러발생x
'코딩 > Java' 카테고리의 다른 글
| 쓰레드(Thread)-2 (0) | 2016.04.05 |
|---|---|
| 컬렉션 프레임웍(Collection Framework),동기화(Synchroization) (0) | 2016.04.01 |
| 내부클래스(inner class) (0) | 2016.04.01 |
| java.long 패키지 (0) | 2016.03.30 |
| 예외처리(excption handling) (0) | 2016.03.29 |