Java/javaSE

Thread-쓰레드[java]

청군로 2021. 5. 27. 20:30

하나의 프로젝트에는 하나의 메인실행부만 존재한다.

이때 다른 실행부의 도움없이 여러 동작을 수행 할때는 문제가 생긴다.

예를 들어 당장 집에서 아기를 돌봐야하는데, 마트에 가서 저녁 거리도 사와야 한다. 또, 은행에 가서 업무도 봐야한다면..

하나 뿐인 몸을 원망하게 될 것이다. 이 사태를 해결할 방법은 주변 사람에게 도움을 청하는 것!

시간이 오래 걸릴 것 같은 일은 부탁을 한다면 나는 내 일을 계속 해 나아갈 수 있다.

 

이 도움을 청하는 사람이 쓰레드이다. 쓰레드는 메인 실행부 외에 또 다른 실행부를 만들어 작업을 수행하는 단위이다.

코드의 예를 들면 내가 while문을 이용하여 무한루프를 생성한 뒤 그 안에서 어떤 숫자 값을 계속 증가 시키고 싶다.

메인 실행부가 무한루프를 만나게 되면 다음 코드는 생각도 하지 않고 오직 무한루프에만 몰두할 것 이다. 이런 상황이 벌어지면, 이 코드는 더 이상 진행 되지도 않고, 종료조차 되지 않는다. 이 상황을 방지하기 위해 쓰레드를 사용한다.

 

쓰레드의 상태

쓰레드의 상태에는 크게    생성, 실행 대기(Runnable), 실행 중(Running) 세 가지로 나눌 수 있는데, 

생성은 말 그대로 쓰레드 객체를 메모리에 올린 상태를 말하고 실행 중은 쓰레드의 실행부가 실행 중인 상태이다.

그렇다면 실행 대기는 어떤 상태인가? 쓰레드에는 sleep( )이라는 메서드가 있다. 이름에서 알 수 있듯이 저 메서드를

만나면 쓰레드의 실행부가 잠시 대기 상태를 갖는다. sleep( ) 메서드에는 매개변수를 넘겨줄 수 있는데 얼마의 시간동안

대기할 것인지 정하는 정수를 넘겨준다. 넘겨준 정수는 1/1000초로 계산된다. 즉 sleep(1000) 만난다면 1초간 대기한다.

 

사용법

java.lang 안에는 Thread라는 클래스가 있는데 직접 new해서 사용할 수 있고, extends로 상속을 받아 사용해도 된다.

탁하고 싶은 작업을 Thread클래스 안에 있는 run( )메서드에 재정의 하면 호출하면 알아서 부탁한 작업을 실행한다.

특이한 점은 thread.run( );으로 호출할 경우 일반 메서드와 같이 메인 실행부가 직접 처리를 하러 간다. 반드시 쓰레드를

이용해서 추가적인 실행부를 만들고 싶을 때는 thread.start( ) 메서드를 호출해야 한다. 호출한건 start이지만 실제로는

새로운 실행부가 만들어지면서, 아까 재정의한 run( )메서드를 호출하게 된다. 이때 run( )메서드 안에 무한루프를 걸어도

메인 실행부는 전혀 지장을 받지 않으며 본인이 가야할 길을 갈 수 있게 된다.

 

 

쓰레드가 없다면 위 코드는 절대 말도 안되는 작업이다. 메인 실행부가 위나 아래의 무한루프를 만나는 순간 빠져 나올 수가 없기 때문...만약 별을 100개 찍어낸뒤 종료라는 조건이 있어도, 하나의 와일문을 다 마친 후 다음 와일문으로 간다.

위의 코드는 쓰레드를 두 개 생성했기 때문에 실행부가 총 3개이다. 메인 실행부와 t1, t2를 실행할 실행부 2개..

따라서 세 개의 실행부는 어떤 작업이 종료될 때 까지 기다리지 않고 자기 갈 길을 간다.

 

결과에서 알 수 있듯이 어느 하나만 실행하지 않고, 골고루 실행한다.