- 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();
*/
}
}
- 결과