Thread의 정의

Thread 생성방법

Runnable interface 구현받는 방법

- Thread를 만들기 위해 어떠한 일을 해줄지 만들어 주는 클래스
- work thread가 할 일

- 7 : main thread가 하는 일이다
- 17 : Runnable을 구현받는 Job을 객체화
- 18 : Thread를 객체화 시키는데 거기에 job이라는 일을 추가
- work라는 thread를 생성해서 그 thread에 job이라는 해야할 일을 부여해 주는거다.
- 19 : work thread 실행 명령어

- main thread의 일을 다 하고 work thread의 일을 한다

- main thread와 work thread 순서 변경

- work thread 실행을 다하고 메인 쓰레드 실행 되는것이 아니라 워크 쓰레드 실행해놓고 메인쓰레드는 자기 할일을 하기 때문에 출력값이 이렇게 나온다

- Runnable interface 구현받는 방법을 익명객체로 활용하는 법
- 원래는 할 일을 만들고 할 일을 넣어 thread를 생성해 주었는데 익명객체로 만들면 원래 할 일 들어가는 자리에 직접 Runnable을 구현받아 override해서 할 일을 넣어 주었다.
- 익명 객체는 여기서 한번만 처리 가능
Thread를 상속받아 생성하는 법

- Runnable interface를 구현받으면 강제로 오버라이드를 해주지만 Thread를 상속받고 있으므로 직접 오버라이드를 해줘야한다
- work thread가 할 일

- Job은 Thread를 상속받고 있으므로 Thread의 형태로 들어갈 수 있다(다형성)
- 원래는 Runnable job = new Job(); -> Runnable 인터페이스를 구현받은 객체화
Thread work = new Thread(job); -> Thread 생성시 runnable 객채 넣어줌
위 과정을 해야 했지만 Job은 Thread를 상속받아서 Thread의 기능을 내것처럼 사용한다
해야 할일을 별도로 넣을 필요가 없기 때문에 위 과정을 안해 줘도 됨

- Thread를 상속받는 방법을 익명객체를로 활용하는 법
- 7 : 부모에게서 상속받아 메서드를 실행하고 싶을 때 객체화를 시키는 과정에서 코드블록을 사용하여 넣어준다
Thread name
- 이름을 지정하지 않으면 Thread-n(0부터시작) 형태의 이름으로 자동 지정된다
- 다른 이름을 지정하고 싶다면 setName()을 사용하지만 이름을 지정해주는 일은 거의 없다.

Thread Priority
Thread Synchronized
- Thread는 memory를 공유 하기 때문에 객체간에 간섭이 일어나기도 한다.
- 내가 사용하는 데이터가 누군가 사용하여 값이 바뀔수도 있다는 뜻이다.
- 이것을 막고싶을 때 Synchronized를 사용한다




- computer 코드
- Synchronized( 동기화 이전 )
- currentThread : 현재 메서드를 사용하고 있는 thread

- thread는 순서가 없고 다른 메서드가 끝날 때 까지 기다리지 않기 때문에 동기화를 해주지 않으면 출력값이

- 메인에서 user1이 실행되고 user2가 실행되었지만 실제로 이 순서가 지켜지지 않는다.
- 실제로 user1의 스코어는 500, user2는 100이지만 이 출력값은 computer코드 15에서 getName을 받고 score를 찍으려고 하는 순간 이미 user2가 들어와서 자신의 스코어를 찍어버린 것이다.
- 이런 일을 막기 위해 Synchronized를 사용해 주어야한다.

- 메서드 자체를 Synchronized해주는 방법

- 동기화 블록을 만들어 주는 방법
- 
- 실제 설정해준값과 같이 나오는 것을 확인할 수 있다.