JAVA

[Java] Thread

lakelight 2022. 7. 29. 11:04
728x90
반응형

Thread

하드디스크에 있는 '프로그램'이 실행되어 메모리에 올라가면 '프로세스'가 됩니다.
CPU는 프로세스를 처리합니다. 프로세스를 처리할 때 CPU의 실행 단위는 쓰레드입니다.
즉 쓰레드가 CPU를 차지하면 프로세스가 수행됩니다.

쓰레드는 각자의 작업공간인 Context 값을 가집니다.
각 쓰레드들이 공유해서 사용하는 Shared Resource가 있습니다.

각 쓰레드들이 동시에 Shared Resource에 접근할 때 문제가 생길 수 있습니다.
그래서 공유 자원은 임계영역(critical section) 이라고 하는데 이 영역을 한 쓰레드가 사용할 때 다른 쓰레드는 못쓰게 합니다.
이를 동기화라고 합니다. 자바에서는 syncronizedsyncronizedBlock이 있다.

이미지 출처: https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

쓰레드 상태

  • Runnable: 언제든지 CPU가 할당되면 수행될 수 있는 상태
  • Run: CPU가 할당된 상태
  • Not Runnable: 쓰레드가 잠깐 쉬는 상태
    • sleep(time) -> time이 끝나면 다시 Runnable 상태로 돌아옵니다.
    • wait() -> notify() 메서드를 호출하면 다시 Runnable 상태로 돌아옵니다.
    • join() -> 다른 쓰레드의 결과가 필요한 쓰레드일 경우 기다리고 쓰레드의 결과가 반환되면 다시 Runnable 상태로 돌아옵니다.

이미지 출처: https://m.blog.naver.com/qbxlvnf11/220921178603

 

자바에서 쓰레드 구현

package Java.thread;

//extends Thread를 해도 되지만 자바 클래스는
//다중상속이 안되기 때문에 인터페이스 Runnable을 상속할 수 있습니다.
class MyThread implements Runnable{

	//run() 함수는 Thread.start()를 했을 때 실행되는 행동을 정의합니다.
    @Override
    public void run(){
        for (int i = 1; i < 201; i++) {
            System.out.print(i + "\t");
        }
    }
}

public class ThreadTest {
    public static void main(String[] args) {

        System.out.println(Thread.currentThread() + "start");

        MyThread runnable = new MyThread();

        Thread th1 = new Thread(runnable);
        Thread th2 = new Thread(runnable);

        th1.start();
        th2.start();

        System.out.println(Thread.currentThread() + "end");

		//간단하게 아래와 같이 쓰레드를 생성할 수도 있습니다.
        Runnable simpleThread = new Runnable() {
            @Override
            public void run() {
                System.out.println("running Thread");
            }
        };

        simpleThread.run();
    }
}

 

결과

Thread[main,5,main]start
Thread[main,5,main]end
running Thread
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 200 200

728x90
반응형

'JAVA' 카테고리의 다른 글

[Java] Thread Method : join()  (0) 2022.07.29
[Java] Priority Thread  (0) 2022.07.29
[Java] Decorator Pattern  (0) 2022.07.28
[Java] Template Method Pattern  (0) 2022.07.28
[Java] Singleton Pattern  (0) 2022.07.28