2013년 7월 2일 화요일

(130702) 7일차 ThreadTest.java (Thread 테스트)

 - Process : CPU를 점유하고 실행(대기)중인 프로그램
 : 하나의 CPU는 동시에 두개의 Process를 실행할 수 없다.
 : Multi-Thread를 지원하는 OS에서는 동시에 여러 개의 프로그램을 실행시킬 수 있다. 그러나 CPU가 동시에 여러 개의 Process를 실행하는 것이 아니라 여러 개의 Process를 아주 작게 자른 Thread를 번갈아 가며 실행한다.

 - Thread : 가장 작은 실행의 단위(작은 process)

 : 하나의 process에는 여러 개의 thread가 있다. 
 : 현재는 OS level에서 multi thread를 지원
 : 각 OS 별 Thread 방법의 차이를 조정하는 것은 프로그래머의 책임이다. O/S마다 처리방식이 각기 다르기 때문에 이를 생각하여 작성하여 주어야 한다. 

 - Thread 생성 방식

 1. Runnable interface을 구현 (implements)
 : public void run() 구현
 : Thread t = new Thread(Runnable을 구현한 객체);
 2. Thread class를 이용 (extends)
 : Thread class는 Runnable을 implements했다. 
 : public void run() 구현

 - Applet은 Thread class를 extends 할 수 없으므로 ①번 만 가능. 

 - Thread 객체의 start()를 호출해 Thread를 실행시킨다.


 - Thread Class를 이용하는 방법 (extends)















 - Runnable interface을 구현하는 방법 (implements)














 - 소스 (Thread class를 이용 - extends)

public class ThreadTest extends Thread {

String name; 


@Override // Thread class는 Runnable을 implements했다.

public void run(){
try{
for(int i=0 ; i<10 ; i++){
Thread.sleep(3000); // 3초마다 한번씩 번갈아가면서 실행
System.out.println(name + i);
}
}
catch (Exception e){
e.printStackTrace();
}
}

public ThreadTest(String data){

name = data;
}

public static void main(String[] args) {


ThreadTest tt1 = new ThreadTest("1번 ");

ThreadTest tt2 = new ThreadTest("2번 ");
ThreadTest tt3 = new ThreadTest("3번 ");

// 이것들은 선점형. 쓰레드가 아니다.

// tt1.run();
// tt2.run();
// tt3.run();

// 쓰레드 적용

tt1.start();
tt2.start();
tt3.start();
}
}


 - 결과





























 - 소스 (Runnable interface을 구현 - implements)

public class ThreadTest2 implements Runnable {

String name; 


@Override // Thread class는 Runnable을 implements했다.

public void run(){
try{
for(int i=0 ; i<10 ; i++){
Thread.sleep(3000); // 3초마다 한번씩 번갈아가면서 실행
System.out.println(name + i);
}
}
catch (Exception e){
e.printStackTrace();
}
}

public ThreadTest2(String data){

name = data;
}

public static void main(String[] args) {


ThreadTest tt1 = new ThreadTest("1번 ");

ThreadTest tt2 = new ThreadTest("2번 ");
ThreadTest tt3 = new ThreadTest("3번 ");

// 쓰레드 적용

new Thread(tt1).start();
new Thread(tt2).start();
new Thread(tt3).start();

/*

// Runnable 인터페이스를 상속받았기에, start 메소드를 사용할 수 없다.
// 쓰레드 객체를 생성 해야만 쓰레드 클래스에 있는 start 메소드를 호출할 수 있음
Thread t1 = new Thread(tt1);
t1.start();
Thread t2 = new Thread(tt2);
t2.start();
Thread t3 = new Thread(tt3);
t3.start();
*/
}
}


 - 결과