본문 바로가기
java

쓰레드(Thread),쓰레드 구현하는방법

by 코딩하는아재냥 2022. 4. 28.

프로세스란 단순히 실행 중인 프로그램

즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다.

프로세스는 프로그램에 사용되는 데이터와 메모리 등 자원 그리고 스레드로 구성됩니다.

 


스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미

모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.

또한 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고합니다.

ex)

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

 싱글 쓰레드 프로세스

= 자원 + 쓰레드

멀티 쓰레드 프로세스

= 자원 + 쓰레드+쓰레드+...+쓰레드

 

멀티 쓰레드 중요한점 : 단점을 보안해야한다.

 

장점 : 가성비 좋음, 시스템 자원을 보다 효율적으로 사용

사용자에 대한 응답성이 향상(ex 카톡에서 대화중에 파일전송도 할수있음)

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

 

단점 : 

공유하는데서 문제가 발생

여러 일꾼이 한개 공장에서 공구를 가지고 일하다 보니 문제점이 발생

동기화에 주의해야한다.

교착 상태가 발생하지 않도록 주의해야한다.( ex 공구 사용 겹침)

기아(특정 쓰레드가 동작이 안되는 상태,기회가 다 뺏겨서 )상태가 오지않도록 주의야한다.


쓰레드의 구현과 실행

1. Thread클래스를 상속 >> 자바는 단일 상속이라서 인터페이스가 더 효율적이다.

 

Thread를 상속받아서 start 메소드를 구현하려면 그냥 this.getName을 적어도 된다.

2. Runnable 인터페이스를 구현 (better) 

 

1,2번 둘다 run() 메소드 작성 >> 쓰레드가 수행할 작업을 작성 이말이다.

 

Thread의 메소드인 start 메소드를 구현하려면 

runnable은 Thread를 상속받지 않아서 getName에 접근할때는

Thread.currentThread().getName()으로 접근한다.

 

class ThreadWithClass extends Thread { // 1.Thread 클래스 상속해서 사용할때의 양식

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(getName()); // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);          // 0.01초간 스레드를 멈춤.

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

 

class ThreadWithRunnable implements Runnable {  // 2.runnable 인터페이스 를 통해 구현하는 방법

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(Thread.currentThread().getName());

// runnable 인터페이스로 start()메소드 작동하려면 Thread.currentThread()

이렇게 불러와야한다.

                             // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

 

public class Thread01 {

    public static void main(String[] args){

        ThreadWithClass thread1 = new ThreadWithClass();       

    // Thread 클래스로           생성해서 구현하는 방법

        Thread thread2 = new Thread(new ThreadWithRunnable());

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

 

        thread1.start(); // 스레드의 실행

        thread2.start(); // 스레드의 실행

    }

}

------

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

Thread-0

Thread-1

 

--------

위의 예제 실행 결과를 살펴보면, 생성된 쓰레드가 서로 번갈아 가며 실행 되고 있는것을 확인할 수 있습니다.

Thread 클래스를 상속받으면 다른 클래스를 상속 받을수 없으므로, 일반적으로 

Runnable 인터페이스를 구현하는 방법으로 스레드를 생성합니다.

 

Runnable 인터페이스는 몸체가 없는 메소드인 run() 메소드 단 하나만을

가지는 간단한 인터페이스입니다.


스레드의 우선순위 >> priority

 

class ThreadWithRunnable implements Runnable {

    public void run() {

        for (int i = 0; i < 5; i++) {

            System.out.println(Thread.currentThread().getName());

                        // 현재 실행 중인 스레드의 이름을 반환함.

            try {

                Thread.sleep(10); //sleep 메소드를 사용하면 InterruptedException 예외를 잡고 시작한다

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

 

public class Thread02 {

    public static void main(String[] args){

        Thread thread1 = new Thread(new ThreadWithRunnable());

        Thread thread2 = new Thread(new ThreadWithRunnable());

 

 

      thread2.setPriority(10); // Thread-1의 우선순위를 10으로 변경함.

 

      thread1.start(); // Thre ad-0 실행

      thread2.start(); // Thread-1 실행

 

   4     System.out.println(thread1.getPriority()); // thread1우선순위 확인

  5      System.out.println(thread2.getPriority()); // thread2우선순위 확인

// main 메소드의 4,5부터 출력이 되고 그다음 run()이 출력이 되는데 3번이 우선순위가 더 높아서

3-2-3-2 순으로 출력된다.

    }

}

'java' 카테고리의 다른 글

스트림(stream)  (0) 2022.04.30
멀티 쓰레드(Thread),데몬 쓰레드(deamon thread),쓰레드 그룹  (0) 2022.04.28
properties  (0) 2022.04.27
Map 컬렉션 클래스  (0) 2022.04.27
Set 컬렉션,HashSet,TreeSet  (0) 2022.04.26

댓글