JAVA/요약

자바 스레드

gandus 2010. 11. 1. 09:04
o프로세스(Process)?
§실행 중인 프로그램 단위. 컴퓨터에서 프로그램을 실행하면 적어도 프로세스를 한 개 이상 동작하게 됨
o스레드
§프로세스에 있는 리소스(resource)를 공유하는 프로그램의 실행 단위
§프로세스에서 독자적인 명령어 제어권을 갖음
§단일 프로세스에서 복수개의 스레드가 존재할 수 있음




한글처럼 문장을 적으면, 문법에 어긋나는 곳에 대한 빨간줄을 표시한다.




스레드의 생명주기( Life Cycle )





 
Create - 스레드를 생성하는 상태
Runnable - 실행 가능한 상태
Running - 스레드가 실행된 상태
Blocked - 스레드가 실행을 중지하고 잠시 멈춰있는 상태
Dead - 스레드가 메모리에서 삭제된 상태다.
o자바에서 스레드를 선언하는 방법
§Thread 클래스를 상속받아 상속받은 Thread 클래스의 run 메소드를 오버라이딩해 사용하는 방법
§Runnable 인터페이스를 이용해 스레드 객체를 생성하는 방법

스레드 클래스를 상속받아서,
run매소드를 오버라이딩을 한다.

Start는 실행을 알리고   -> run() 을 수행
Run은 실제로 실행하는 것을 의미한다.


왜 두번째 방법이 생김??
자바에서 부모 클래스를 2가지 못가짐 - 다중상속 지원 안되서

그래서 Runnable 인터페이스를 이용해서 구현을한다.




스레드의 기본 예제이다.


class Thread_Ex1 extends Thread {

 

       public void run() {

             try {

                    for (int i = 0; i < 20; i++) {

                           Thread.sleep(500);

                           System.out.println(i + " : " + i + " * " + i + "= " + (i * i));

 

                    }

             } catch (InterruptedException e) {

                    System.out.println(e.getMessage());

             }

       }

 

}

 

public class main {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

             // TODO Auto-generated method stub

 

             Thread_Ex1 thread = new Thread_Ex1();

             thread.start();

             System.out.println("스레드 종료 전에 다음 코드 실행 확인.");

 

             try {

                    for (int i = 0; i < 10; i++) {

                           Thread.sleep(800);

                           System.out.println("원래 스레드 : " + i);

 

                    }

             } catch (InterruptedException e) {

                    System.out.println(e.getMessage());

             }

       }

}

 


 








class Thread_Ex3 extends Thread {

       public Thread_Ex3(String name){

             super(name);

       }

      

       public void run(){

             try {

                    for(int i=0; i<5; i++)

                    {

                           Thread.sleep(1000);

                           System.out.println(i + "" + super.getName() + ":스레드");

                    }

             }

             catch (InterruptedException e){

                    System.out.println(e.getMessage());

             }

       }

}

 

public class thread_name {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

             // TODO Auto-generated method stub

            

             Thread_Ex3 ob1 = new Thread_Ex3("처음");

             Thread_Ex3 ob2 = new Thread_Ex3("두번");

             Thread_Ex3 ob3 = new Thread_Ex3("세음");

            

             ob1.start();

             ob2.start();

             ob3.start();

       }

}

 

cpu에 먼저 접근하는 놈이 먼저 실행되기 때문에
실행 결과는 다 다르다.