[Java] Thread#1, 스레드의 개념 및 기본 예제

프로세스와 스레드

프로세스

운영체제에서는 실행중인 하나의 어플리케이션을 프로세스라고 함.

운영체제로부터 실행에 필요한 메모리를 할당받아 어플리케이션의 코드를 실행.

 

스레드

프로세스를 이루는 코드의 실행흐름.

하나의 스레드는 하나의 코드 실행흐름임.

 

멀티 프로세스

서로 독립적. 하나의 프로세스에서 오류가 발생하더라도 다른 프로세스에 영향을 미치지 않음.

 

멀티 스레드

하나의 프로세스 내부에 존재하기 때문에 하나의 스레드가 예외를 던지면 프로세스 하나가 아예 동작하지 않을 수 있음 -> 예외 처리 중요.

 

메인 스레드

자바 어플리케이션은 메인스레드가 main 메소드를 실행하면서 시작함.

 

스레드의 생성

1. Thread 클래스로부터 직접 생성

Thread thread = new Thread(Runnable target);

- 직접 생성하기 위해서는 Runnable 타입을 매개값으로 갖는 생성자를 호출해야함.

- Runnable은 인터페이스 타입인데 run 메소드가 선언되어 있어 Runnable 구현객체는 run 메소드를 구현해야함.

- Runnable 구현객체를 직접 Class로 정의해서 사용하거나 익명객체를 이용(주로 쓴다고 함.)하는 방법이 있음.

- 코드를 실행하기 위해서는 run 메소드 호출이 아닌 start()를 호출해야함.

Runnable taskrun = new Task();
Thread thread = new Thread(taskrun);
Thread threadanony = new Thread( new Runnable(){
	public void run(){
    	//스레드가 실행할 코드흐름	
    }
});

2. Thread 하위 클래스로부터 생성.

- Thread 클래스를 상속해야함.

import java.awt.Toolkit;

public class BeepThread extends Thread{
	@Override
	public void run() {
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		for(int i =0; i<5; i++) {
			toolkit.beep();
			try {Thread.sleep(500);} catch(Exception e) {}
		}
	}
}

- 0.5초마다 비프소리를 내는 스레드 하위 클래스 생성.

import java.awt.Toolkit;

public class BeepPrintExample3 {
	public static void main(String[] args) {
		Thread thread = new BeepThread();
		
		//2. ㅇ익명객체
		Thread thread2 = new Thread() {
			@Override
			public void run() {
				Toolkit toolkit = Toolkit.getDefaultToolkit();
				for(int i =0; i<5; i++) {
					toolkit.beep();
					try {Thread.sleep(500);} catch(Exception e) {}
				}
			}
		};
		
		
		thread2.start();
		
		for(int i =0; i<5; i++) {
			System.out.println("띵");
			try {Thread.sleep(500);} catch(Exception e) {}
		}
	}
}

- 띵 출력과 띵 비프음이 거의 동시에 수행되는것처럼 결과가 나올 것.

 

스레드의 이름정의

- 스레드는 스레드마다 이름이 있음.

- 큰 역할을 하지는 않지만 디버깅할때 어떤 스레드가 에러를 내는지 조사할 목적으로 사용된다고 함.

- 이름을 주지 않은 스레드는 "Thread-n"이라는 이름으로 설정됨.

- setName("스레드이름") 으로 스레드명을 설정가능.

- getName() 메소드로 스레드 이름을 반환.

thread.setName("스레드명");
thread.getName(); // 스레드명 반환

- currentThread()로 현재 코드를 실행하고 있는 스레드의 참조를 얻어올 수 있음

Thread thread = Thread.currentThread();

간단 예제

public class ThreadNameExample {
	public static void main(String[] args) {
		Thread mainThread = Thread.currentThread();
		System.out.println("프로그램 시작 스레드 이름: "+mainThread.getName());
		
		ThreadA threadA = new ThreadA();
		System.out.println("작업 스레드 이름 : "+threadA.getName());
		threadA.start();
		
		ThreadB threadB = new ThreadB();
		System.out.println("작업 스레드 이름 : "+threadB.getName());
		threadB.start();
		
	}
}
//-----------------------------------
public class ThreadA extends Thread{
	public ThreadA() {
		setName("ThreadA");
	}
	
	@Override
	public void run() {
		for(int i =0; i<2; i++) {
			System.out.println(getName()+"가 출력한 내용");
		}
	}
}
//-----------------------------------
public class ThreadB extends Thread{
	@Override
	public void run() {
		for(int i =0; i<2; i++) {
			System.out.println(getName()+"가 출력한 내용");
		}
	}
}

댓글

Designed by JB FACTORY