728x90
반응형

스레드(thread)

 - 멀티 태스킹(muli-tasking) : 여러 개의 애플리케이션을 동시에 실행하여서 컴퓨터 시스템의 성능을 높이기 위한 기법

 - 다중 스레딩 : 하나의 프로그램이 동시에 여러 가지 작업을 할 수 있도록 하는 것

 - 각각의 작업은 스레드 라고 한다.

 

 

 

프로세스와 스레드

 프로세스(process) : 자신만의 데이터를 가진다.

 스레드(thread) : 동일한 데이터를 공유한다.

 

 

 

프로그램과 프로세스

  프로그램 ---(실행)---> 프로세스

 

▶프로그램:실행 가능한 파일(HDD)                        ▶프로세스:실행 중인 프로그램(메모리)

 

 

프로세스와 스레드

 프로세스 : 실행 중인 프로그램. 자원(resources)과 스레드(thread)로 구성

 스레드(thread) : 프로세스 내에서 실제 작업을 수행하는 것, 모든 프로세스는 하나 이상의 스레드를 가지고 있다.

           프로세스 : 스레드 = 공장 : 일꾼            

 

 

멀티프로세스와 멀티스레드

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

 

 

 

멀티스레드의 장단점

 장점

- CPU의 사용률을 향상시킨다.

- 자원을 보다 효율적으로 사용할 수 있다.

- 사용자에 대한 응답성(responseness)이 향상된다.

- 작업이 분리되어 코드가 간결해 진다.

 

 단점

- 동기화(synchronization)에 주의해야 한다.

- 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.

- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.

- 프로그래밍할 때 고려해야 할 사항들이 많다.

※교착상태(dead-lock) : 두 스레드가 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태

 

 

 

스레드를 사용해야 하는 이유

- 웹 브라우저에서 웹 페이지를 보면서 동시에 파일을 다운로드할 수 있도록 한다.

- 워드 프로세서에서 문서를 편집하면서 동시에 인쇄한다.

- 게임 프로그램에서는 응답성을 높이기 위하여 많은 스레드를 사용한다.

- GUI에서는 마우스와 키보드 입력을 다른 스레드를 생성하여 처리한다.

 

 

스레드 생성과 실행

 스레드는 Thread 클래스가 담당한다. (java.lang.Thread)

        Thread t= new Thread();       //스레드 객체를 생성한다.

         t.start();                              //스레드를 시작한다.       

 스레드의 작업은 Thread 클래스의 run() 메서드 안에 기술한다.

 

 

 

스레드를 사용하는 방법

  스레드 생성 방법

    Thread 클래스를 상속하는 방법 :Thread 클래스를 상속받은 후에run() 메서드를 오버라이딩한다.Thread 클래스를 상속 받으면 다른 클래스는 상속받을수 없다.

    Runnable 인터페이스를 구현하는 방법 : run() 메서드를 가지고 있는 클래스를 작성하고, 이 클래스의 객체를 Thread 클래스의 생성자를 호출할 때 전달한다.

 

1. Thread클래스를 상속

  class MyThread extends Thread {

         public void run () { /* 작업내용 */ } //Thread클래스의 run()을 오버라이딩

   }

 

2. Runnable인터페이스를 구현

  class MyThread implements Runnable {

         public void run () { /* 작업내용 */ }  // Runnable인터페이스의 추상메서드 run()을 구현

   }

 

 

 

Thread 클래스 상속하는 방법

 - Thread를 상속받아서 클래스를 작성한다. (java.lang.Thread)

 - run() 메서드를 오버라이딩한다.

     class My Thread extends Thread {

          public void run()  {

                ...    // 수행해야하는 작업을 적어준다.

           }

      }

- Thread 객체를 생성한다.

        Thread t = new MyThread ();

- start()를 호출하여서 스레드를 시작한다.

         t.start();

 

 

>>Thread 클래스 상속하는 방법

 

 

 

 

Runnable 인터페이스를 구현하는 방법

 - Runnable 인터페이스를 구현한 클래스를 작성한다. (java.lang.Runnable)

 - run() 메서드를 오버라이딩 한다.

        class MyRunnable implements Runnable {

                public void run() {

                      ...

                 }

        }

 - Thread 객체를 생성하고 이때 MyRunnable 객체를 인수로 전달한다.

        Thread t = new Thread(new MyRunnable ());

 - start()를 호출하여 스레드를 시작한다.

        t.start();

 

 

 

>>Runnable 인터페이스를 구현하는 방법

 

 

 

 

 

 

Thread 클래스의 메서드

 

 

 

 

 

>>싱글 스레드

하나의 스레드로 사용자의 입력을 받는 작업과 하면에 숫자를 출력하는 작업을 처리하기 때문에 사용자가 입력을 종료하기 전까지는 화면에 숫자가 출력되지 않고, 입력을 마치면 화면에 숫자가 출력된다.(※ 사용자가 입력을 종료하기 전까지는 아무 일도 못하고 기다려야 한다.)

 

 

 

 

 

 

>>멀티 스레드

두 개의 스레드로 사용자의 입력을 받는 작업과 화면에 숫자를 출력하는 작업을 처리하기 때문에 사용자의 입력을 기다리는 동안 다른 스레드가 작업을 처리할 수 있다. 입력받는 부분과 출력하는 부분을 두 개의 스레드로 나누어 처리하기 때문에 사용자가 입력을 종료하지 않아도 화면에 숫자가 출력된다.

 

 

 

 

 

>>main 스레드

 

 

​>>sleep() 메서드

​sleep()은 CPU의 시간을 다른 스레드에게 넘겨주는 방법이다. 다른 스레드와 보조를 맞추는 역할도 한다.

 

​join() 메서드

- 하나의 스레드가 다른 스레드의 종료를 기다리게 하는 메서드이다.

- 예를 들어서 t가 현재 실행 중인 스레드 객체이면 다음 문장을 t가 종료될 때까지 기다린다.

>>join() 메서드

join()을 사용하지 않으면 main()이 바로 종료되지만, join()을 사용해서 th1과 th2의 작업을 마칠때까지 main()이 기다리도록 한다.

한 쓰레드의 작업 중간에 다른 쓰레드의 작업이 필요할 때 join()을 사용한다.

 

 

>>join() 메서드

두 스레드가 번갈아가며 실행되지 않고, 순차적으로 실행되는 경우 (th1 실행 후 th2 실행)

 

728x90
반응형

+ Recent posts