-
[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