Thread ^^;;
* Thread클래스를 하위클래스에서 상속받아서 사용하는 경우는 run()에서 보다 구체적인 작업을 하기 위한 목적으로 사용하길 바람...(이런 방식은 비추천됨.)
* Runnable인터페이스를 상속받아서 사용하기를 권장함.
* Thread클래스나 Runnable인터페이스를 상속받아 구현하는 클래스에 run()에서 작업할 내용(메서드)을 기술함.
* 주요메서드
- 동기화: synchronized 키워드 사용(공유자원에 락(lock)걸기)
- wait(): 스레드를 NotRunnable 상태로 만듦.
- notify(), notifyAll(): NotRunnable상태의 스레드를 Runnable상태로 만듦.
- Thread.sleep() //InterruptedException예외발생. try~catch사용. 실행하고자 하는 스레드를 잠시 멈춤.. , 대기상태
* 스레드의 실행은 스레드스케쥴러에 의해서 관리됨...
만일 스레드의 실행방식에 어느정도의 순번을 기대코자 한다면 sleep()메서드를 활용할것.
* 자바에서는 애플리케이션 내부의 모든 스레드가 종료되지 않으면 JVM이 종료되지 않음.
* 두개 이상의 스레드 사용시 고려사항....
- 두개 이상의 스레드가 하나의 객체 데이터에 접근할 경우...
즉 서로 다른 스택 두개에서 실행되는 메서드가 동일한 객체에 대한 게터 또는 세터 메서드를 호출할 경우 문제가 발생할 수 있음...
이전에 자신이 했던 작업을 기억하지 못하기 때문에 실행하다 대기상태에 들어가게 되면
객체의 데이터가 변화했음을 감지하지 못하고 예상치 못한 결과값을 출력할 수 있슴.
* 스레드를 사용할 때 객체를 안전하게 만들고 싶다면 ...
다른 스레드가 같은 객체의 같은 메서드에 들어가기 전에 끝까지 실행되어야만 하는 메서드를 결정하여 synchronized로 동기화시킴.
* 락은 매서드마다 하나씩 있는 것이 아니고 객체마다 하나씩 있슴.
즉, 동기화된 메서드 하나에 스레드 두개가 들어갈수 없슴.
* 동기화의 목적은 처리중의 데이터를 외부로부터 보호하기 위함.
* 동기화를 할 경우 꼭 필요한 부분에만 사용할것...
- 동기화의 단점은 프로그램의 속도를 저하시키며,
여러군데 동기화를 적용할 경우 데드락이 발생할수 있슴.
(주의요망 : 두개 이상의 객체와 두개 이상의 스레드가 있을경우....)