쓰레드란 프로그램의 흐름을 형성하는 것이다.

지금까지 우리는 main 메소드를 이용해 main 쓰레드 하나가지고 이요했다.

그 말은 하나의 프로세스만 돌렸다는 뜻이다.
쓰레드를 이용하면 여러개의 처리를 동시에 할 수 있다.

?
CPU가 하나인데 여러개의 프로세스를?
우리 운영체제는 보통 시분할 즉 시간을 나누어 프로세스에 분배한다.
우리 눈에는 동시에 일이 처리되는 듯 보이는 것이다.

쓰레드 생성 모습


(Thread를 상속받아 클래스를 만들었다.)




(쓰레드를 생성하고 시작.)




위 코드에서 보는 것과 같이 쓰레드를 이용하려면
Thread 라는 클래스를 상속받아야 한다.
또 Thread를 상속받은 클래스 내에서 run이라는 메소드를 오버라이드 해야한다.

이렇게 만든 클래스를 생성하여 .start()코드로
run() 메소드를 동작시킨다.

위 코드는 st1 클래스의 run과 st2클래스의 run이 동시에 돌아가는 것이다.

만약,
다른 클래스를 상속받는 클래스를 쓰레드로 이용하려면 어떻게해야할까?
위에서 봤듯이 쓰레드를 이용하려면 Thread를 상속받아야한다.
자바에서는 다중상속이 안되기 때문에 다른 방법이 필요하다.
바로 인터페이스로 구현하는 것이다.


(Runnable 인터페이스를 상속받는 코드)



위에서 보듯 Runnable 인터페이스를 상속 받으면 된다. 그리고 run() 을 꼭 채워줘야한다. start()함수로 run()이 실행되기 때문이다.





(생성한 클래스를 Thread 클래스의 인자로 넘긴다.)





위에서 보듯 Runnable 인터페이스를 상속받은 클래스는
실행하려면 결국 Thread 클래스로 돌아가야한다.
다중상속의 기능을 위해 우리는 Runnable 인터페이스를 상속시켜서
그 클래스 인자를 Thread 클래스의 인자로 넘겨서 사용했다.

쓰레드는 우선순위를 가지고 있다.
아래 코드를 실행시켜보면 우선순위에 대한 이해가 될 것이다.




(우선순위 확인 코드)



* 동기화
- 위에서 말했듯이 쓰레드는 각자 독립적으로 실행이된다.
그렇기 때문에 다른 애들이 어떻게 일하는지 신경안쓰고 혼자 신나게 동작한다.

하지만 코드를 작성하는 우리 입장에서는
쓰레드끼리 서로 합이 맞길 바란다.
아래 처럼


(비동기화된 코드)




(실행결과)



결과를 보면 실행 메인코드는 첨부하지 않았지만 300,000,000이 출력되야한다. 하지만 실행한 쓰레드들이 각자 동작하다보니 요상한 값이 출력된 것이다.

동기화 시키는 방법은 간단히 synchronized 메서드를 이용하면 된다.



(동기화 된 코드)





(실행 결과)





이렇게 동기화를 시켜주면
내가 원하는대로 쓰레드들이 합을 맞추어 올바른 결과를 내었다.

synchronized 함수는 여러가지 key를 가지고 돌아갈 수 있다.
다른 식으로 설명하자면 토큰식이라고 생각할 수 있다.
토큰이 돌고 돈다. 이 토큰을 가진 놈들만 일을 할 수 있는 것이다.
그렇기 때문에 synchronized로 동기화를 시켜줄 수 있는 것이다.

이 토큰을 늘릴 수 있는데 Object를 하나 더 이용하는 것이다.



(두개의 키를 이용한 코드)



혹은 쓰레드들을 서로 기다리고 이제 왔으니 일어나라는 등의 명령을 내려줄 수 있다.



(notifyAll 코드)




notifyAll 구문으로 기다리고 있던 다른 쓰레드들을 부를 수 있다.
혹은
wait() 구문으로 다른 애들이 부르기 전까지 기다리는 구문도 있다.

이런 식으로 쓰레드들을 정교하게 동기화 시킬 수도 있다.

(*참조 - 난  정말 JAVA를 공부한 적이 없다구요, 윤성우)





+ Recent posts