프로세스 : 실행 중인 프로그램, 자원과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
프로세스 : 쓰레드 = 공장 : 일꾼
- 싱글 쓰레드 프로세스 : 자원 + 쓰레드
- 멀티 쓰레드 프로세스 : 자원 + 쓰레드 + 쓰레드....
※ 하나의 새로운 프로세서를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
class MyThread extends Thread{
public void run() {
Thread클래스의 run( )을 오버라이딩
}
}
class MyThread2 implements Runnable{
public void run(){
Runnable 인터페이스의 추상메서드 run()을 구현
}
}
멀티 쓰레드 실행
public class thread {
public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.start();
Runnable r = new Thread2();
Thread t2 = new Thread(r);
t2.start();
}
}
class Thread1 extends Thread{ // Thread클래스를 상속해서 쓰레드 구현
public void run(){
for(int i=0; i<5; i++){
System.out.println(getName());
}
}
}
class Thread2 implements Runnable{ // Runnable 인터페이스 상속해서 쓰레드 구현
public void run(){
for(int i=0; i<5; i++)
System.out.println(Thread.currentThread().getName());
}
}
동작방식
(1) main메서드에서 쓰레드의 start( )를 호출한다.
(2) start( )는 새로운 쓰레드를 생성하고, 쓰레드가 작업한느데 사용될 호출스택을 생성한다.
(3) 새로 생성된 호출스택에 run( )이 호출되어, 쓰레드가 독립된 공간에서 작업을 수행한다.
(4) 이제는 호출스택이 2개이므로 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행된다.
public class thread {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
for(int i=0; i<300; i++)
System.out.print("-");
System.out.print("소요시간1 :" +(System.currentTimeMillis()-startTime));
for(int i=0; i<300; i++)
System.out.print("l");
System.out.print("소요시간2 :" +(System.currentTimeMillis()-startTime));
}
}
--- 결과 ---
----- 소요시간1 : 5
ㅣㅣㅣㅣ 소요시간2 : 7
public class multithread {
static long startTime = 0;
public static void main(String[] args) { // main 쓰레드에서 1개 동작
MyThread t1 = new MyThread(); // 새로운 쓰레드 생성
t1.start(); // 쓰레드 실행
startTime = System.currentTimeMillis();
for(int i=0; i<300; i++)
System.out.print("l");
System.out.print("소요시간1 :" +(System.currentTimeMillis()-startTime));
}
}
class MyThread extends Thread{ // MyThread 쓰레드 1개 동작
public void run(){
for(int i =0; i<300; i++)
System.out.print("-");
System.out.print("소요시간2 :" +(System.currentTimeMillis()- multithread.startTime));
}
}
--- 결과 ---
ㅣ----ㅣㅣㅣㅣㅣㅣㅣㅣㅣㅣ---ㅣㅣ (번가라가면서 동작함)
소요시간2 : 7 소요시간1 : 7 (os의 스케줄에 따라 순서가 정해짐)
위에가 싱글 쓰레드 밑에가 멀티쓰레드인데 멀티쓰레드가 좀 더 오래 걸리는것을 확인할 수 있다. 이유는 A->B 2개의 쓰레드가 번갈아가면서 동작하기 때문에 변경되는 시간이 발생해서 이다.
그럼 멀티쓰레드를 사용하는 이유는 무엇일까??
시간이 좀더 걸리더라도 2개를 동시에 동작할 수 있다는 점이다. 예를 들면 채팅같은 프로그램에서는 2명이 동시에 채팅을 할 수 있도록 구현이 되어야 한다. 하지만 싱글스레드를 사용하게 되면 무전기처럼 한명만 채팅이 가능할 것이다. 따라서 이처럼 동시에 여러가지를 하기 위해서 멀티 쓰레드를 사용하는 것이다.
싱글 스레드
public class Thread {
public static void main(String[] args) throws Exception {
String input = JOptionPane.showInputDialog("아무값이나 입력하세요");
System.out.println(" 입력하신 값은 " + input + "입니다. ");
for(int i = 10 ; i > 0 ; i--){
System.out.print(i);
try{
Thread.sleep(1000); // 1초의 시간지
} catch(Exception e) {}
}
}
}
--- 결과 ---
입력하신 값은 test 입니다.
10 9 8 ... 1
멀티 스레드
public class MultiThread {
public static void main(String[] args) throws Exception {
Thread1 th1 = new Thread1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + " 입니다." );
}
}
class Thread1 extends Thread {
public void run(){
for(int i = 10 ; i > 0 ; i--){
System.out.println(i);
try {
sleep(1000);
} catch(Exception e) {}
}
} // run ()
}
--- 결과 ---
10 9 8
입력하신 값은 test 입니다.
7 6 ... 1
※ 참고자료 : 자바의 정석