반응형

제목:dank

start()와 run()


start()와 run()의 차이


run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드를 하나 호출하는것


start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(call stack)을 생성 한 다음에 run()을 호출해서 생성된 호출스택에 run()이 첫번째로 저장되게 한다



start()는 호출스택을 생성 run()까지 진행하는 셈


모든 쓰레드는 독립적임


단독의 호출스택이 필요함  그래서 쓰레드를 생성하고 실행시킬때마다 새로운 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출스택은 소멸



1.main메서드에서 쓰레드의 start메서드를 호출

2.start메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출스택을 생성

3.생성된 호출스택에 run메서드를 호출 쓰레드가 작업을 수행하도록

4.호출스택이 2개이기 때문에 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행


호출스택에서 가장위가 현제 실행중인 메서드


나머지는 대기


쓰레드가 둘이상일때는 최상위에 메서드 일지라도 대기 상태에 있을수 있다


아직 종료 되지 않은 쓰레드들의 우선순위를 고려하여 실행순서와 실행시간을 결정

쓰레드들은 지정된 순서와 시간에 실행을 한다.


주어진 시간동안 작업을 마치지 못한 쓰레드는 다시 자신의 차레가 돌아올때까지 대기 상태가됨


작업을 마친 쓰레드는 호출스택이 모두 비워지고 호출스택이 사라짐=main메서드가 종료되는 방식과 같음


main메서드 또한 쓰레드임


쓰레드=일꾼


프로그램 실행시 기본적으로 하나의 쓰레드(일꾼)을 생성 일꾼이 main메서드를 호출해서 작업이 수행 되도록 하는것


지금까지는 main메서드가 종료되면 프로그램이 종료 되었으나


main메서드가 종료 되었다 하더라고 쓰레드가 살아 있으면 프로그램은 종료 되지않는다


쓰레드가 모두 종료 되어야 프로그램이 종료된다.


쓰레드종류

1.사용자 쓰레드

2.데몬쓰레드



싱글 쓰레드와 멀티 쓰레드


하나의 쓰레드에 두개 작업 하나가 끝나면 다른 작업을 시작


두개의 쓰레드로 작업


짧은 시간동안 2개의 스레드가 번갈아 가면서 작업을 수행  동시에 두작업이 처리되는 것과 같이느낌


하나의 쓰레드던 두개의 스레드던 작업하는 시간은 같다


하지만 두개의 쓰레드가 시간이 더 걸리는데 그이유는 작업전환(contenxt switching)에 시간이 걸리기 때문


단순히 cpu만 사용하는 계산 작업이면 오히려 싱글쓰레드로 프로그래밍하는 것이 호율적


작업전환시 현재 진행중인 작업의 상태 , 다시 진행해야할 위치 등의 정보를 저장하고 읽어오는 시간이 소요됨


자바가 OS 독립적이라고 하지만 실제로는 OS종속적인 부분이 몇가지 있다 그중에 하나가 쓰레드


cpu이외의 자원을 사용하는 작업의 경우에는 싱글쓰레드 프로세스 보다 멀티 쓰레드 프로세스가 효율적


사용자 입력 시간에 다른 쓰레드를 실행 할수 있다


싱글쓰레드는 입력시간을 받는 쓰레드가 입력전까지 대기상태





쓰레드의 우선순위


쓰레드는 우선순위(priority)라는 속성(멤버변수)를 가지고 있다


우선순위에 값에 따라 쓰레드가 얻는 실행시간이 달라진다

쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여

특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다.


시각적인부분이나 사용자에게 빠르게 반응해야하 하는 작업을 하는 쓰레드에 우선순위를 높혀줌


우선순위가 높아지면 먼저 실행하고 할당 시간이 늘어난다


void setPriority(int newPriority)-쓰레드의 우선순위를 지정한 값으로 변경한다.


int getPriority()-쓰레드의 우선순위를 반환한다.


public static final int MAX_PRIORITY=10 //최대 우선순위

public static final int MAX_PRIORITY=1 //최소 우선순위

public static final int MAX_PRIORITY=5 //보통우선순위


우선순위의 범위 1~10

절대적이 아닌 상대적임


실행시간 배정 시간 차이가 큼


main메서드를 수행하는 쓰레드는 우선순위가 5

main메서드 내에서 실행하는 쓰레드의 우선순위는 자동적으로 5가됨


우선순위 1차이는 별차이가 없으나 2이상의 차이는 많은 차이가 있다.


쓰레드 그룹(Thread group)


서로 관련된 쓰레드를 그룹으로 다루기 위해서 윈도우 폴더에 넣어서 관리하는 것과 같음


메서드에는 생성,포함,반환,삭제,확인,출력 등등이있다.


Thread(ThreadGroup group, String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, runnable target, string name)

Thread(ThreadGroup group, runnable target, string name, long stackSize)


모든 쓰레드는 그룹에 포함되어 있어야 한다


쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 쓰레드 그룹에 속함


ex) main쓰레드는 main쓰레드 그룹에 가비지 컬렉션을 수행하는 Finalizer쓰레드는 system쓰레드 그룹에 속함


static int activeCount():쓰레드 자신이 속한 쓰레드 그룹에 작업이 완료되지 않은 쓰레드의 수를 반환


ThreadGroup getThreadGroup():쓰레드 자신이 속한 쓰레드 그룹을 반환




반응형

'코딩 > Java' 카테고리의 다른 글

쓰레드(Thread)-1  (0) 2016.04.04
컬렉션 프레임웍(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


반응형

 제목:꽃게

 

프로세스와 쓰레드


프로세스란? 실행중인 프로그램


프로그램 →실행→ 프로세스


프로세스는 데이터,메모리 자원,쓰레드로 구성


프로세스 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드


프로세스에는 최소한 하나 이상의 쓰레드가 존재


둘이상을 멀티쓰레드,프로세스 라고 한다.


싱글쓰레드 프로세스 = 자원+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


반응형

제목:무제 



java.util패키지를 중심으로 실제 프로그래밍에 자주 사용되는 클래스를 세가지 그룹으로 나누면


1.컬렉션 프레임웍-다수의 데이터를 쉽게 처리할 수 있는 표준화된 방법을 제공하는 클래스들

2.유용한 클래스-알아두면 좋은 자주 쓰이는 클래스들

3.형식화 클래스-데이터를 표준화된 형식으로 출력하는데 도움을 주는 클래스들



중에서 컬렉션 프레임웍


데이터 군을 저장하는 vector와 같은 클래스들을 표준화한 설계


데이터 그룹을 표준화 시킴


컬렉션 프레임웍의 핵심 인터페이스 - List , Set , Map


List-순서가 있는 데이터 집합,데이터의 중복을 허용한다

구현 클래스: ArrayList , LinkedLiset , Stack , Vector 등


Set-순서를 유지하지 않는 데이터의 집합 데이터의 중복을 허용하지 않는다.

구현 클래스:HashSet , TreeSet


Map-키(key)와 값(value)의 상(pair)으로 이루어진 데이터의 집합

순서는 유지되지 않으며 키는 중복을 허용하지 않고 값은 중복을 허용한다.

구현 클래스: HashMap , TreeMap , Hashtable , Properties 등



1.Collection인터페이스


List와 Set가 Collection을 상속 받아 인터페이스가됨


메서드는 추가,확인,삭제 등등이있음


2.List 인터페이스


중복을 허용하면서 순서대로 저장하는 컬렉션


메서드는 추가,출력,확인,삭제 등등이있음


3.Set인터페이스


중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션





4.Map인터페이스


키와 값을 한쌍으로 묶어 저장하는 컬렉션


키는 중복가능하나 값은 중복을 허용하지 않음


중복된 키,값을 넣을시에 기존값을 삭제 마지막에 저장된 값이 남음


메서드는 삭제,확인,키값으로 값을 반환,비교 등등 이있음


5.Map.Entry인터페이스


Map인터페이스의 내부 인터페이스

내부인터페이스를 이용 인터페이스안에 인터페이스를 정의하는것이 가능


public interface Map{

interface Entry{

//내용

}

}


메서드는 비교,반환,수정등이있음.



동기화(Synchronization)


멀티 스레드 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근 할수 있기 때문에 데이터의 일관성을 유지 하기 위해서 동기화가 필요함


여러명이 같은 객체를 사용시 충돌 예방


Vector와 Hashtable과 같은 클래스는 자체적으로 동기화를 처리 그러나 멀티쓰레드가 아닌 프로그램에 경우 불필요 하기 때문에 성능을 떨어뜨림


ArrayList,HashMap은 동기화를 필요할때만 메서드를 이용해서 동기화 처리를 함


ex) List list=Collections.synchronizedList(new ArrayList(...));




반응형

'코딩 > Java' 카테고리의 다른 글

쓰레드(Thread)-2  (0) 2016.04.05
쓰레드(Thread)-1  (0) 2016.04.04
내부클래스(inner class)  (0) 2016.04.01
java.long 패키지  (0) 2016.03.30
예외처리(excption handling)  (0) 2016.03.29

+ Recent posts