프로세스, 쓰레드 관련 - YunByungKwan/Fundamental GitHub Wiki

Java에서 쓰레드를 정의하는 방법 (3가지)

  • Thread를 상속하는 새로운 클래스를 정의

    public class MyThread extends Thread {
      ...
      public MyThread() {
        ...
      }
    
      @Override
      public void run() {
        ... // 여기가 실행된다.
      }
    }
    ...
    public static void main(String []args) {
      MyThread myThread = new MyThread();
      myThread.start(); // start()로 쓰레드 시작
    }
    
  • Runnable 인터페이스를 구현한 클래스를 정의

    public class MyRunnable implements Runnable {
      ...
      public MyRunnable() {
        ...
      }
    
      @Override
      public void run() {
        ... // 여기가 실행된다.
      }
    }
    ...
    public static void main(String []args) {
      MyRunnable myRunnable = new MyRunnable();
      Thread thread = new Thread(myRunnable);
      myThread.start(); // start()로 쓰레드 시작
    }  
    
  • 익명 클래스로 정의 (일회용)

    new Thread(() -> {
      ...
    }).start();
    

Kotlin에서 쓰레드를 정의하는 방법 (4가지)

  • Thread를 상속하는 새로운 클래스를 정의

    class MyThread: Thread() {
      override fun run() {
        ...
      }
    }
    ...
    fun main() {
      val myThread = MyThread()
      myThread.start()
    }
    
  • Runnable 인터페이스를 구현한 클래스를 정의

    class MyRunnable: Runnable {
      override fun run() {
        ...
      }
    }
    ...
    fun main() {
      val myRunnable = MyRunnable()
      val thread = Thread(myRunnable)
      thread.start()
    }
    
  • 익명 클래스로 정의 (일회용)

    fun main() {
      object: Thread() {
          override fun run() {
            ...
          }
      }.start()
    }
    
  • 람다식으로 정의

    fun main() {
      Thread {
        ...
      }.start()
    }
    

Android에서 Thread Pool 생성하기

  • 쓰레드를 만드는 것은 비용이 많이 들기 때문에 스레드 풀을 한번만 만들어야 한다. 그래서 Application클래스에서 만든다. (ExecutorService)

[참고]

  • 모던 컴파일러, 가상 머신, 프로세서는 수많은 최적화를 알아서 진행해.
  • 그 중 하나는 메모리 위치 캐싱인데, 프로세서(CPU)는 필요한 데이터를 레지스터나 온보드 메모리 캐시에 유지하다가 결국에는 변경 내용을 다시 메모리에 쓴다.
  • 또 다른 최적화 중 하나는 명령어 재정렬이야.
    x = y와 관련 없는 값;
    y = x와 관련 없는 값;
    z = x + y;
    
    1, 2번째는 3번째 보다는 먼저 일어나야 되지만 순서가 상관없기 때문에 프로세서가 순서를 바꿀 수도 있다.
  • 이러한 최적화는 동시 메모리 접근이 없다고 가정한다.
  • 잠금은 임계 영역을 보호하고 일련의 연산을 원자적으로 만들 수 있어. 하지만 잘못 사용하면 성능이 심각하게 떨어지거나 교착 상태에 빠질 수 있어.