2015. 1. 6. 05:52
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

애플리게이션은 애플리게이션의 코드를 통해 독립적인 실행 경로를 갖는 스레드를 통해 실행된다. 만일 여러개의 스레드가 실행되면 그레드 별로 다른 경로를 가지게 되는데 예를 들어 한 애플리케이션에 여러개의 스레드가 실행될 경우 코드에 switch문이 있을 때 스레드 별로 분리되어 서로 다른 case절이 실행 될 수 있다.


스레드는 애플리케이션의 성능을 높이기 위해 사용한다. 애플리게이션의 목적에 따라 일부 애플리게이션은 주어진 작업을 수행하기 위해 오직 기본 main 스레드만을 사용할 수 있으며, 다른 일부 애플리케이션은 시간이 많이 소요되는 작업을 백그라운드에서 처리하기 위해 추가적인 스레드를 사용하기도 한다.대기 시간이 길어지는 작업을 백그라운드로 스레드로 처리하며 백그라운드 작업의 종료 여부와 상관없이 지속적으로 사용자의 요구에 대응을 할 수 있다.


JVM은 스레드간의 간섭을 방지하기 위해 스레드별로 메소드 호출 스택을 갖고 만든다. 이 분리된 스택들은 스레드의 명령을 수행할 경로를 유지시켜 주며 더불어 이 스택은 메소드 파라미터, 로컬 변수 그리고 반환값의 복사본과 스레드를 제공한다.


자바는 Threading API를 통해 스레드를 지원하는데 이 API는 java.lang.package에 위치하며 하나의 인터페이스(Runnable) 그리고 네개의 클래스 (Thread, ThreadGroup, ThreadLocal, InheritableThreadLocal)로 구성되어 있다.


자바 5에서는 낮은 수준의 Threading API에 대한 대안이 되는 높은 수준의 java.util.concurrent 패키지를 소래한다. 비록 java.util.concurrent가 개발자가 선호하는 API 형태로 스레드와 작업을 제공하지만 간단한 스레딩을 작성할 경우 낮은 수준의 Threading API가 도움이 된다.



---------------------------------



Runnable과 Thread


자바에서는 인터페이스의 void run() 메소드(인자와 반환값이 없음)를 통해 스레드를 실행시키는 코드를 포함하고 있는 객체를 식별하기 위한 Runnable 인터페이스를 제공한다. 클래스에서는 스레드 코드를 제공하기 위해서 Runnable을 구현하며 이런 클래스 중 하나가 Thread클래스이다.


Thread 클래스는 애플리케이션이 실행되는 운영체제의 스레딩 아키텍처와 일치하는 인터페이스를 제공한다(일반적으로 운영체제에서 스레드의 생성과 관리에 대한 책임을 진다). Thread클래스는 코드와 스레드를 연결하고, 스레드들에 대한 시작과 관리를 하며 각각의 Thread 인스턴스는 각각의 스레드와 연결이 된다.


Thread 클래스에는 Thread 객체를 초기화하는 몆가지 생성자가 선언되어 있는데 일부 생성자는 Runnable을 인자로 받으며 Thread의 확장없이 실행 될 수 있는 코드를 제공 할 수 있다. Runnable로 초기화하지 않고, 대신 Thread의 서브 클래스에서 Thread()를 호출하는 생성자를 제공하여야 하며 서브 클래스에서 Thread의 run() 메소드를 오버라이드 해야 한다.


인자에 명시된 이름이 없기 때문에 각 생성자는 Thread객체에 Thread-로 시작되며 중복이 안되는 기본 이름을 할당한다. 이렇게 동적으로 생성되고 중복이 안되는 이름을 사용해 서로 다른 스레드를 만드를 것이 가능하다. 동적으로 중복이 안되는 기본 이름이 제공되는 위의 두 생성자와는 달리 Thread(String threadName) 생성자에서는 스레드의 이름을 임의로 저장할 수 있다.


Thread 클래스에서는 스레드를 시작하고 관리할 수 있는 메소드를 포함하고 있다




스레드 메소드들


static Thread currentThread()

이 메소드를 호출한 스레드와 연관되어 있는 Thread 객체를 반환한다.


String getName()

현재 Thread 객체의 이름을 반환한다.


Thread.State getState()

현재 Thread 객체와 연관되어 있는 스레드의 상태를 반환한다. 상태는 Thread.State enum형으로 식별이 되며 상태에는 BLOCKED(lock 대기), NEW(생성하지만 시작은 안함), RUNNABLE(실행중), TERMINATED(스레드 종료), TIMED_WAITING(지정한 시간만큼 대기), WAITING(무기한 대기) 등이 있다.


void interrupt()

현재 Thread객체에 인터럽트 상태 플래그를 설정한다. 만일 스레드가 블록 또는 대기 상태가 되면 이 플래그가 클리어되고 InterruptedException 클래스의 인스턴스가 던져져 스레드가 꺠어나게 된다.


static boolean interrupted()

스레드에 보류된 인터럽트 요청이 있을 경우 true를 반환한 후 인터럽트 상태 플러그를 클리어 한다.


boolean isAlive()

현재 Thread 객체와 연관된 스레드가 활동 상태에 있을 때 true를 반환한다. 데몬 스레드는 사용자 스레드를 도와주며 애플리케이션의 마지막 비데몬 스레드가 종료되어 애플리게이션이 종료될 때 자동적으로 종료된다. 현재 Thread객체와 관련되어 있는 스레드가 데몬 스레드 일 때 true를 반환한다. 데몬 스레드는 사용자 스레드에 대한 헬퍼 스레드 역할을 하며 애플리게이션의 마지막 일반 스레드(데몬 스레드가 아닌 스레드) 가 종료될 떄 자동적으로 종료된다.


boolean isInterrupted()

현재 Thread 객체와 연관되어있는 스레드에 보류되어 있는 인터럽트 요청이 있을 때 true를 반환한다.


void join()

현재 Thread 객체에서 이 메소드를 호출한 스레드를 객체와 연관된 스레드가 종료할 때까지 기다린다. 이 메소드는 대기중에 현재 Thread 객체의 interrupt() 메소드가 호출되면 InterruptedException이 던져진다.


void join(long mills)

호출한 메소드 스레드가 종료될 때까지 또는 지정한 시간동안 대기한다. 이 메소드는 대기중에 현재 Thread 객체의 interrupt() 메소드가 호출되면 InterrptedException이 던져진다.


void setDaemon(boolean isDaemon)

인자 isDaemon을 true로 지정하면 현재 Thread 객체와 연관된 스레드를 데몬 스레드로 설정한다. 스레드는 생성 또는 시작하기 전에 호출되면 java.lang.illegalThreadStateException이 던져진다.


void setName(String threadName)

인자 threadName의 값을 현재 Thread 객체 이름으로 지정한다.


static void sleep (long time)

지정한 시간(밀리 초) 만큼 현재 Thread 객체와 연관된 스레드를 일시 정지 시킨다. 스레드가 일지 정지되어 있는 동안 스레드 객체의 interrupt() 메소드가 호출되면 InterruptedException이 던져진다.


void start()

현재 Thread 객체와 연관되어있는 스레드를 생성하고 시작한다. 스레드가 이미 시작되어 실행중이거나 종료되어 있는 상태이면 IllegalThreadStateException을 던진다.



--------


package Thread;

public class CountingThreads {
    public static void main(String[] args){
        Runnable r=new Runnable() {
           
            @Override
            public void run() {
                String name=Thread.currentThread().getName();
                int count=0;
                while(true){
                    System.out.println(name+": "+count++);
                }
            }
        };

        Thread thdA =new Thread(r);
        Thread thdB=new Thread(r);
        thdA.start();
        thdB.start();
    }
}


기본 메인 스레드가 실행되는 main()에서는 우선 Runnable을 구현한 익명 클래스를 인스턴스화한다. 다음에 객체를 runnable로 초기화되는 두 개의 Thread객체를 생성한 후 스레드를 생성하고 시작하기 위해 Thread클래스의 start() 메소드를 호출한다. 이 작업들을 완료한 후 main() 메소드의 메인 스레드는 종료한다.


메인 스레드에서 시작된 두 스레드는 각각 runnable의 run() 메소드를 실행하는데 run()메소드에서는 Thread인스턴스를 획득하기 위해 Thread의 currentThread() 메소드를 호출한 후 getName()메소드를 호출하여 이름을 반환 받는다. 다음에 count를 0으로 초기화 시키고 name과 count의 값을 출력한 후 count 의 값을 증가기키면서 무한 반복한다.







'Java > Working-level Java' 카테고리의 다른 글

Thread 3  (0) 2015.01.14
Thread 2  (0) 2015.01.14
System  (0) 2015.01.06
StringBuffer / StringBuilder  (0) 2015.01.03
ChatClient  (0) 2014.12.26
Posted by af334