[java] 자바 스레드
스레드(thread)를 공부하기에 앞서 정확한 의미를 알아보고자 IT용어 사전을 검색해 봤는데 이런 뜻이네요. 일정한 구간을 실행하는 프로그램의 실제 작업구간 정도로 이해하고 공부를 시작하면 될거 같네요.
■ 자바에서 멀티스레드 프로그램을 만드는 방식은 두가지고 있는데요.
▶ java.lang.Thread 클래스를 상속 받아서 하는 방법
▶ java.lang.Runnable 인터페이스를 구현하는 방법(인터페이스를 구현하는 방식은 사용할 메서드들이 없기 때문에 thread 클래스의 객체와 함께 사용해야 합니다.)
■ 왜 이렇게 두가지 방법을 만들어 놨을까요?
이건 상속과 관련된 부분인데, 자바는 클래스의 다중 상속이 안되기 때문인데요. 만약에 스레드 외에 다른 클래스를 상속받은 클래스에서 thread를 구현하려면 Runnable과 같은 인터페이스가 꼭 필요하기 때문입니다.
▣ Thread API
Construct
Method
■이론은 이쯤하고 예제를 만들어 가면서 살펴보도록 하겠습니다. 먼저 Runnable을 구현하는 방식부터 알아보도록 하겠습니다.
■ 코딩 내용을 살펴보면 Thread 이전 프로그램에서는 main()메서드에서 시작하고 끝이 났지만 이번 예제에서는 public void run()메서드가 주체가 됩니다. 물론 매인이 먼저 실행이 되고 나중에 실행이 되지만 매인과 동급으로 따로 실행되는 메서드가 되는 것입니다. run()에는 알파벳 대문자'A' 부터 소문자 'z'까지 100번 출력하게 한것입니다. 아래 결과에서 보듯이 연속으로 100번이 다 출력이 되는게 아니고 중간에 섞여서 출력이 됐습니다. 이것은 main 스레드와 AAA의 thread가 시분할 개념으로 CPU의 제어권을 가로채기 때문에 일어나는 현상입니다.
■ 내용을 분석해 보면 먼저 "main thread (메인 메서드 시작)"이라는 문구가 제일 먼저 출력이 될것입니다. 다음으로 AAA클래스의 인스턴스를 생성하고 Thread클래스의 생성자를 이용하여 Runnable인터페이스를 구현한 AAA클래스의 인스턴스를 매개변수로 하여 새로운 인스턴스를 생성했습니다. 다음으로 start()메서드를 호출해서 실행합니다.
■ 이것을 실행해보면 그때마다 결과는 다르게 나타나게 됩니다. CPU의 제어권을 가로채는 시점이 매번 다르기 때문입니다. 또 컴퓨터의 상태에 따라서도 다를 수 있습니다.
■ 다음으로 Thread를 상속받은 클래스에 대해서 알아볼게요. 다음과 같이 스레드 클래스를 상속받아서 run() 내용은 위와 동일하게 했습니다.
■ Runnable에서는 실행시킬 수 있는 메서드가 없었기 때문에 Thread클래스의 생성자를 이용하여 스레드의 형태를 갖추도록 만들어줬지만 여기서는 클래스를 상속받았기 때문에 생성자를 이용하여 담아줄 필요가 없습니다. 바로 start()를 하면 main thread와 동급인 또하나의 thread가 실행이 됩니다.