20.12.11

민주·2021년 1월 17일
  1. Thread의 정의

    • thread는 program을 실행하게 해주는 원동력이다
    • main method는 thread를 동작하게 해주는 메서드이다.
    • main method가 main thread를 생성하는 것이다(main method가 곧 main thread라고 생각)
    • main thread는 자신을 위해 일 할 work thread를 생성 할 수 있다.
    • 일처리를 혼자하는건 single thread, 여러개가 같이 하는건 multi thread
    • process도 program을 움직이지만 차이점은
      ○ process간에는 memory share가 안된다
      ○ Thread간에는 memory share가 된다
      ○ 예 ) 엑셀과 워드간에는 서로 상태가 공유되지 않는다
      ○ 예 ) 워드내의 작성기능과 자동완성기능은 서로 상태를 알고있다
  2. Thread 생성방법

  3. 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해서 할 일을 넣어 주었다.
    - 익명 객체는 여기서 한번만 처리 가능

  4. 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 : 부모에게서 상속받아 메서드를 실행하고 싶을 때 객체화를 시키는 과정에서 코드블록을 사용하여 넣어준다

  5. Thread name
    - 이름을 지정하지 않으면 Thread-n(0부터시작) 형태의 이름으로 자동 지정된다
    - 다른 이름을 지정하고 싶다면 setName()을 사용하지만 이름을 지정해주는 일은 거의 없다.

  6. Thread Priority

    • 여러 Thread를 실행하다 보면 순서가 제멋대로여서 제어가 어렵다.
    • Thread 는 라운드 로빈 방식을 사용하기 때문이다
      ○ 라운드로빈 방식 : 빨리 처리하는 녀석이 다음 일을 받는 방식으로 먼저 시작했다고 먼저 끝나지 않는다.
    • 그래서 우선순위 방식이 있지만 이마저도 잘 지켜지지 않는다.
    • setPriority 메서드로 우선순위 부여가능
  7. Thread Synchronized
    - Thread는 memory를 공유 하기 때문에 객체간에 간섭이 일어나기도 한다.
    - 내가 사용하는 데이터가 누군가 사용하여 값이 바뀔수도 있다는 뜻이다.
    - 이것을 막고싶을 때 Synchronized를 사용한다


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

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

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

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

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

profile
개발이좋아요

0개의 댓글