쓰레드

배지원·2022년 10월 18일
0

JAVA

목록 보기
29/32
post-custom-banner

1.프로세스와 쓰레드

프로세스 : 실행 중인 프로그램, 자원과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.

프로세스 : 쓰레드 = 공장 : 일꾼
- 싱글 쓰레드 프로세스 : 자원 + 쓰레드
- 멀티 쓰레드 프로세스 : 자원 + 쓰레드 + 쓰레드....


※ 하나의 새로운 프로세서를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.


2. 쓰레드의 구현과 실행

1. Thread클래스를 상속

class MyThread extends Thread{
	public void run() {
    		Thread클래스의  run( )을 오버라이딩
    }
}

2. Runnable 인터페이스를 구현

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());
    }
}
  • 쓰레드를 생성했다고 해서 자동으로 실행되는 것은 아니다 즉, start( )를 호출해야만 쓰레드가 동작함
  • 2개 이상의 쓰레드를 실행했을 경우 동작되는 순서는 OS의 스케줄러가 작성한 스케줄에 따라 결정된다. 먼저 실행했다고 해서 먼저 동작하는것은 아니다.

동작방식
(1) main메서드에서 쓰레드의 start( )를 호출한다.
(2) start( )는 새로운 쓰레드를 생성하고, 쓰레드가 작업한느데 사용될 호출스택을 생성한다.
(3) 새로 생성된 호출스택에 run( )이 호출되어, 쓰레드가 독립된 공간에서 작업을 수행한다.
(4) 이제는 호출스택이 2개이므로 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행된다.


3. 싱글쓰레드와 멀티 쓰레드

싱글쓰레드

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명이 동시에 채팅을 할 수 있도록 구현이 되어야 한다. 하지만 싱글스레드를 사용하게 되면 무전기처럼 한명만 채팅이 가능할 것이다. 따라서 이처럼 동시에 여러가지를 하기 위해서 멀티 쓰레드를 사용하는 것이다.


3. 쓰레드의 I/O 블락킹

  • 쓰레드가 I/O(입출력)을 처리하기 위해 기다리는 상황

싱글 스레드

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
  • 이처럼 싱글쓰레드로 작성시 사용자가 값을 입력할때까지 기다렸다가 값을 출력 후 For문을 실행하게 된다.

멀티 스레드

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
  • 멀티 쓰레드로 작성 시 사용자로부터 입력을 기달리는 동안 For문이 실행이 된다.

※ 참고자료 : 자바의 정석

profile
Web Developer
post-custom-banner

0개의 댓글