Thread란?
- 하나의 프로세스 안에서 실행되는 명령 흐름 즉, 프로세스 안의 작은 프로그램이다.
- 자바는 멀티스레딩을 지원하는데 이를 지원하기 위해 Thread클래스와 Runnable인터페이스를 제공한다.
- 멀티스레딩이란 하나의 프로세스 안에서 여러 개의 스레드가 동시 작업하는 것을 말한다.
- 즉 한 프로그램 내에서 두 가지이상의 일을 수행하는 것이다.
- main메소드를 가진 자바 프로그램은 하나의 스레드를 가진(main스레드)단일 스레드라고 볼 수 있다.
- Thread클래스나 runnable인터페이스르 상속받아 다른 스레드를 동작시킬 수 있다.
▲ 먼저 스레드로 구현하지 않은 클래스를 만들어보자
▲ 그리고 스레드로 구현하지 않고 for문으로 메소드를 하나 만들어보자
▲ 그리고 메인에서 실행해보자
▲ 결과는 위와 같다. main메소드에서 main스레드시작이라는 문구를 출력한뒤 각각의 for문이 끝나고 main메소드의 마지막에 있는 코드인 main스레드 끝이 실행되면서 좋료된다.
이번에는 스레드를 사용해서 구현한 메소드를 만들어보자
▲ 스레드로 구현한 클래스를 만들기 위해서 우선 Thread를 상속받아 Thread의 맴버를 사용할 수 있게한다. 스레드는 생성자 안에 String타입의 문자열을 넣어주면 해당 스레드명으로 사용할 수 있는 기능이있다.
위에서 wait상태, Runnable상태 등은 아래의 그림과 같이 스레드의 동작원리에 포함되어 있는 단계이다.
▲ start()메소드를 실행하면 스레드는 실행되는 것이아니라 실행가능한 준비상태가 된다. 이후 준비상태에 있는 스레드들을 스레드 스케줄러가 임의로 순서로 실행상태(Running)로 만들고 실행상태가 되면 스레드에서 자동으로 run()이라는 메소드를 호출해서 메소드가 실행되는 것이다. 실행이 종료된 메소드는 스레드 종료상태(Dead)가 된다.
실행(Running)단계에서 우리가 wait()이나 sleep()과 같은 메소드를 호출하면 대기(Wait)상태로 들어가며 sleep()메소드와 같이 wait상태에서 있을 시간을 정해주면 해당 시간동안 Wait상태에 있다 다시 Runnable상태가 된다. 이후 다시 스케줄러가 임의의 순서로 실행시키는 과정을 거치는 것이 스레드의 동작원리이다.
▲ 마지막으로 Thread클래스에 있는 run()메소드를 오버라이딩 시키면 준비가 끝나게 된다.
이제 메인메소드에서 실행시켜보자
▲ 스레드는 스케줄러에 의해서 임의의 순서로 실행이 된다. 가장 먼저실행되는 것은 main메소드에 들어왔을 때의 첫번째 코드인 main 스레드 시작이 먼저 실행되고 이후 yt1.start()를 통해서 실행가능상태(Runnable)상태로 진입하고 yt2.start()도 동일하다. 이후 main 스레드 끝 코드가 실행된 후 스케줄러에 의해 yt1과 yt2은 스케줄러의 마음대로 임의의 순서대로 실행되고 sleep()을 통해 wait상태로 갔다가 다시 실행가능상태(Runnable)상태로 가서 스케줄러의 명령을 기다리게 된다. main메소드는 끝났지만 yt1과 yt2클래스는 for문이 다 돌때까지 스케줄러의 실행,sleep,Runnable,Running,Rung상태를 반복하는 것이다.
매번 실행시킬때마다 첫번째 스레드와 두번째 스레드의 순서는 랜덤하게 출력된다.
▲ join()메소드를 사용하면 join()메소드를 호출한 스레드가 다 실행된 후 다른 스레드가 실행되는 기능이다.
무조건 먼저 실행을 원하는 스레드의 start()메소드 다음에 호출해야 한다.
▲ 그냥 스레드를 진행하면 순서가 랜덤으로 실행되었는데 join()을 사용니까 join()을 호출한 스레드가 먼저 실행이 다 끝나고 그 다음스레드가 또 순차적으로 실행되는 것을 볼 수 있다.
▲ 모든 스레드는 default로 우선순위값이 5로 되어있다. 여기서 우선순위값이 높을 수록 우선되어진다는 것인데 setPriorty()로 우선권을 최대로 높여줘도 무조건 먼저실행되는 것은 아니다. 단순히 확률이높아질 뿐이다.
▲보다시피 무조건적으로 우선되는 것은 아니다.
우리가 지금껏 살펴본 모든 스레드는 독립스레드이다.
독립스레드(Non Demon 스레드)
- main스레드와 working스레드(개발자가 만든 스레드)가 끝나도 종료되지 않고 스레드가 Dead상태가 될 때까지 계속실행되는 스레드이다.
이번에는 종속 스레드를 알아보자
종속스레드(Daemon스레드)
- 모든 독립스레드가 끝나면 자동으로 종료(Dead)가 되는 스레드이다
- 주 스레드의 보조역할을 하는 스레드이며
- 종속스레드는 주로 무한루프로 구성한다.
- 예)배경음악을 깐다든지, 10분마다 자동저장한다든지 등등
- 어떤 스레드를 종속 스레드로 만들려면 setDaemon(true)로 설정하면 된다.
▲ 종속스레드로 사용할 클래스를 만든다. 종속스레드는 주로 무한루프형식으로 구성해서 주 스레드가 끝날때까지 계속 실행되어야 하기 때문이다. 이 또한 역시 스레드의 상속을 받아야한다.
▲메인에서 실행해보자. 여기서 주의할점은 종속스레드를 만들고 호출하는 setDaemon()은 start()메소드 이전에 호출되어야 한다는 것이다 만약 start()이후에 setDaemon()을 호출한다면 IllegalThreadStateException이 발생한다.
▲ 출력결과는 위와같다. 주 스레드가 종료되기 전까지는 설정해둔 시간마다 종속스레드가 계속 실행되고 주 스레드가 종료되면 종속스레드도 같이 종료가 된다.
'Java' 카테고리의 다른 글
[Java]입력과 출력 -part.2(bridge stream) (0) | 2022.03.23 |
---|---|
[Java]입력과 출력(Input and Output) - part.1 Basic (0) | 2022.03.23 |
[Java]익명 클래스(Anonymous Class) (0) | 2022.03.22 |
[Java]Builder pattern (0) | 2022.03.22 |
[Java]내부클래스 - part.2 내부 정적 클래스 (0) | 2022.03.22 |