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