ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 스레드
    기초/JAVA 2017. 2. 9. 10:57

    스레드

    Thread

    특히 프로세스 내에서 실행되는 흐름의 단위를 말하는데요.

    일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만,

    프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 해요 -위키백과

     

     

    프로그램 내에서 동시에 2개 이상의 연산, 처리, 동작을 하기위해서 사용되는데요.

    프로그램은 순서대로 실행되는 프로그램이기 떄문에 한동작을 완료할 때 까지는 아래에 있는 동작이 대기상태에 놓입니다.

    따라서 순서에 상관없는 동작같은 경우 스레드로 사용한다면

    대기하지 않고 두 동작을 빠르게 실행하게 되는거죠.,

     

    예를들어 통장에 돈을 넣는 과정을 생각해보면

    ATM기기에 돈을 넣었을 떄 발생되는 동작

    ATM기기에는 돈을 넣은 만큼 기기잔고가 쌓일 것이고

    예금주 통장에는 넣은만큼 잔고가 쌓일텐데

    이 두가지 작업은 순서에 상관없는 동작입니다.

    은행같은 경우는 실시간으로 빠른처리가 이루어져야기 때문에

    이런경우 스레드를 사용할 수 있습니다.

    돈을 넣고 나서

    두 잔고의 덧셈, 뺄셈 연산을 스레드로 실행하게 되면 처리가 더빨라지겠네요.

     

    [사용법]

    스레드는 run()이라는 메소드를 Override해서 생성한뒤

    호출을 .start(); 메소드로 호출하게 되면 스레드가 실행됩니다.

     

    [스레드 생성방법]

    메인함수에서

    ThreadOwn클래스는 자체로 스레드가 되었고

    ThreadTwo클래스는 Thread클래스에서의 매개변수로 넘겨져서 스레드가 된것을 보실 수 있습니다

     

    @Thread 상속받기

    ThreadOwn 클래스처럼 Thread클래스를 extends로 상속받으면

    클래스 자체가 스레드 클래스가 됩니다.

    따라서 스레드클래스를 상속받은 클래스의 객체들은 모두 스레드의 역할을 할 수 있습니다.

     

    public class ThreadOwn extends Thread

     

     

    ThreadOwn t1 = new ThreadOwn();

     

     

    @Runnable 상속받기

    Runnable을 implements하게 되면 run()메소드를 Override 하게 됩니다.

    또한 스레드로 사용하려고 할 시에는

    Thread 클래스를 객체로 생성하고 생성자의 매개변수로 Runnable을 implements한 클래스를 넘겨주면서 스레드로 사용이 가능하게 됩니다.

     

    public class ThreadTwo implements Runnable

     

     

    Thread t1 = new Thread(new ThreadTwo());

     

     

     

     

    Main클래스 즉 프로그램 하나에서

    ThreadOwn

    ThreadTwo

    두 개의 흐름(스레드)가 실행되는 거예요.

    스레드에서도 두 흐름에 빠르게 왔다갔다하면서 처리를 하는것이지

    한 흐름을 실행하고 다른 흐름을 실행하는 것이 아닌데요.

    결과를 보시면 Own thread가 와 Two Thread를 번갈아가면서 실행하는 것을 볼 수 있습니다.

     

    매우 빠르게 실행되는 동작이라 하지만

    은행에서와 같이 잔고 계산에서 만원이 입금되었는데 연산을 실행하는 도중에 잔고를 출력한다면 잔고는 만원이 입금되기 전의 금액이 뜨겠죠?

     

    이런 에러를 방지하기 위해 스레드의 구간을 통제해주는 명령어들이 있습니다.

     

     

     

    @동기화

    synchronized

     

    [사용법]

    1.메소드 앞에 동기화 쓰기

    접근제한자 synchronized 자료형 메소드이름();

     

     

    2.공유 객체 사용하기

    synchronized(공유객체){

    보호될 구간

    }

    [스레드 중지]

    하지만 이런 동기화 상태이더라도 서로 간섭을 받지 않는 대기 상태에 놓이기 때문에 스레드는 프로세스를 잡고있는 현상이 생깁니다.

    따라서 스레드를 중지시키고 다시 시작시키는 메소드가 있습니다.

     

    @wait

    스레드를 잠시 대기(중지) 시킵니다.

     

    객체.wait();

     

    @notify

    멈춰있던 스레드를 다시 실행시킵니다.

     

    객체.notify();

     

    @sleep

    스레드의 흐름을 ms단위로 대기시킵니다.

    sleep이란 단어 자체로 스레드가 잠시 자는상태를 말하는데요

    프로그램이 매우 빠르게 실행되기때문에 사용자의 눈에 보이기 위해서

    스레드를 잠시 자는 상태로 만드는겁니다.

    '기초 > JAVA' 카테고리의 다른 글

    자바 정규식 EUC-KR 한글 문제  (0) 2019.06.13
    [JAVA] 기초공부  (0) 2017.07.20
    [JAVA] 예외처리 / 예외발생  (0) 2017.02.09
    [JAVA] 직렬화 / 역직렬화  (0) 2017.02.08
    [JAVA] Math클래스  (0) 2017.02.07

    댓글

Designed by Tistory.