Java Thread - 4

목차

    Java Thread - 4

    💡 학습 목표
        1. 쓰레드(Thread)란 뭘까?
        2. 쓰레드를 추가로 만들어서 사용하는 방법을 알아 보자.
        3. 쓰레드의 실행시 쓰레드 상태라는 개념을 알아 보자.

    1. 쓰레드(Thread)란 뭘까?

    Thread 란?

    • process란? 저장되어 있는 프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 된다.
    • 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.

    그림 1

    그림 2

    2. 쓰레드를 추가로 만들어서 사용하는 방법을 알아 보자.

    1. Thread 클래스 상속하여 만들 수 있다.

    package useful.ch05;
    
    /**
     * 쓰레드를 추가하는 방법 - 상속을 활용할 수 있다. 
     * Thread -> Runnable --> run()
     */
    public class MyThread extends Thread {
    
    	// 우리가 정의한 클래스에서 run() 메서드를 재정의 할 수 있다.
    	// 쓰레드를 사용할 때 알아야 하는 필수 개념 - 그냥 외우자!
    	// 쓰레드가 가지고 있는 메서드 start()를 호출 시키면 약속으로
    	// run() 메서드가 호출되어 동작하게 만들어져 있다.
    	@Override
    	public void run() {
    		// 우리가 동작 시키고자 하는 일을 정의해서 코드를 설계할 수 있다.
    		// 임무 -> 반복문 200번을 수행해!
    		for (int i = 0; i < 200; i++) {
    			System.out.println(i);
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    } // end of class
    package useful.ch05;
    
    public class MyThreadMainTest {
    
    	// 기본적으로 메인 작업자 하나를 가지고 있다. 메인 쓰레드라 한다.
    	public static void main(String[] args) {
    
    		System.out.println(Thread.currentThread());
    
    		// 필요하다면 추가 작업자를 사용할 수 있다.
    		MyThread th1 = new MyThread();
    		th1.start(); // start 호출되면 run() 메서드가 동작되게 약속되어 있다.
    		System.out.println("---------------------------------------------------------");
    
    		// 필요하다면 추가 작업자를 더 만들 수 있다.
    		MyThread th2 = new MyThread();
    		th2.start();
    
    	} // end of main
    
    } // end of class
    package useful.ch05;
    
    // HOW, WHY
    public class Worker extends Thread {
    
    	private String name;
    
    	public Worker(String name) {
    		this.name = name;
    	}
    
    	// 약속된 부분 --> run() 메서드를 정의하면 된다.
    	@Override
    	public void run() {
    		for (int i = 0; i < 50; i++) {
    			System.out.println("worker : " + name + " : " + i);
    			try {
    				Thread.sleep(200);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    package useful.ch05;
    
    public class WorkerMainTest {
    	
    	// 메인 작업자
    	public static void main(String[] args) {
    		
    		System.out.println("----------- main 쓰레드 시작 -------------");
    		System.out.println(Thread.currentThread());
    		
    		// 작업자 하나 만들어 내기
    		Worker worker1 = new Worker("워커1"); // 생성은 메인 쓰레드가 했다.
    		// 명령어를 통해서 워커1에게 너가 위임 받은 일을 시작해
    		worker1.start(); // 메인 쓰레드가 명령 내림
    		System.out.println("----------- main 쓰레드 종료 -------------");
    	}
    
    }


    2. Runnable 인터페이스 구현하여 만들 수 있다.

    package useful.ch05;
    
    /**
     * 쓰레드를 만드는 두번째 방법 Runnable 인터페이스를 
     * 활용하는 방법
     */
    public class MyThread2 implements Runnable {
    
    	// Thread 클래스에서 start 메서드가 호출되면
    	// 동작하는 부분이라고약속되어 있다.
    	@Override
    	public void run() {
    		int i = 0;
    		while (i < 10) {
    			System.out.println(" i : " + i);
    			i++;
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    package useful.ch05;
    
    public class MyThread2MainTest {
    
    	// 메인 작업자
    	public static void main(String[] args) {
    		System.out.println("main start ");
    
    		// 문제 MyThread2 를 메모리에 올리고
    		// 그 안에 정의된 run() 메서드를 호출 하시오.
    		// 힌트 --> Thread 문서를 반드시 확인하시오.
    
    		Runnable myThread1 = new MyThread2();
    		Runnable myThread2 = new MyThread2();
    		// myThread1.run(); 일반 메서드 호출, 쓰레드 아님. 걍 이름만 run()인 메서드일뿐
    
    		// 새로운 작업자를 생성해서 위임 시킬때는 Thread 안에 있는 start() 메서드를 호출해야 한다.
    		Thread thread1 = new Thread(myThread1);
    		Thread thread2 = new Thread(myThread2);
    		thread1.start();
    		thread2.start();
    		System.out.println("main end ");
    	}
    
    }

    3. 쓰레드의 실행시 쓰레드 상태라는 개념을 알아 보자.

    Thread Status

    정리

    스레드(Thread)란?

    • 스레드는 프로세스 내에서 실제로 작업을 수행하는 단위이다.
    • 모든 자바 프로그램은 메인 스레드에서 시작되며, 사용자는 추가적인 스레드를 생성할 수 있다.
    • 각 스레드는 독립적으로 실행되며, 자신만의 호출 스택을 가진다.(각 쓰레드의 스택 영역은 서로 격리되어 있다)
    • 프로세스 내의 모든 스레드는 같은 Heap 메모리 공간과 다른 자원을 공유할 수 있다.

    Java 유용한 클래스 - 3 으로 돌아가기