JAVA/Thread

[Java] Thread (스레드)

숭어싸만코 2023. 5. 26. 12:55

용어정리

프로세스: 실행중인 프로그램

멀티태스킹: 두가지 이상의 작업을 동시에 처리멀티 

프로세스: 멀티태스킹을 할때 처리방법

-멀티태스킹과 멀티 프로세스는 다르다.

 

스레드

- 코드의 실행 흐름

-멀티스레드는 프로그램 내부에서의 멀티 태스킹

멀티스레드

-프로세스내에 여러 코드 실행 흐름

-프로세스가 두가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문

 

싱글스레드 - 메인 스레드가 종료되면 프로세스도 종료

멀티스레드 - 실행중인 스레드가 하나라도 있다면 프로세스는 종료되지 않는다.

- 메인스레드가 작업스레드보다 먼저 종료 되더라도 프로세스는 종료 되지않는다.

 

Thread 클래스로 직접 생성

- Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 Runnable 구현 객체를 매개값으로 갖는 생성자를 호출

THread thread = new Thread(Runnable target);

Runnable은 스레드가 작업을 실행할 때 사용하는 인터페이스

 

익명 구현객체 사용하여 생성하는 방법

package study0526.Thread;

import java.awt.Toolkit;

public class P597_멀티스레드 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// ==== Runnable 익명 구현객체를 매개값 / 작업스레드 생성 ====
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {

				Toolkit toolkit = Toolkit.getDefaultToolkit();
				for (int i = 0; i < 5; i++) {
					System.out.println("======");
					try {
						Thread.sleep(500);
					} catch (Exception e) {
					}
				}
			}
		});
		// ==== 작업스레드 실행 ====
		thread.start();

		// ==== 메인스레드 실행 코드 ====
		for (int i = 0; i < 5; i++) {
			System.out.println("띵");
			try {
				Thread.sleep(500);
			} catch (Exception e) {
			}
		}
	}//

}//

 

익명 자식객체 사용하여 생성하는 방법

package study0526.Thread;

import java.awt.Toolkit;

public class p600_멀티스레드2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//==== 익명 자식객체를 이용해 작업스레드 생성 ====
		Thread thread = new Thread() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				Toolkit toolkit = Toolkit.getDefaultToolkit();
				for (int i = 0; i < 5; i++) {
					System.out.println("======");
					try {
						Thread.sleep(500);
					} catch (Exception e) {
					}
				}
			}
		};
		//==== 작업스레드 실행 ====
		thread.start();
		
		// ==== 메인스레드 실행 코드 ====
		for (int i = 0; i < 5; i++) {
			System.out.println("띵");
			try {
				Thread.sleep(500);
			} catch (Exception e) {
			}
		}

	}//

}//

스레드 이름변경

- thread.setName( "스레드이름")

package study0526.Thread;

import java.util.Iterator;

public class P601_스레드이름 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Thread mainThread = Thread.currentThread(); // 이코드를 실행하는 스레드 객체 참조얻기
		System.out.println(mainThread.getName() + " 실행");

		// ===== Thread-n 3개 생성 =====
		for (int i = 0; i < 3; i++) {
			Thread threadA = new Thread() {
				@Override
				public void run() {
					System.out.println(getName() + " 실행");
				}
			};
			threadA.start();
		}

		// ===== chat-thread로 이름 변경하여 생성 =====
		Thread chatThread = new Thread() {
			@Override
			public void run() {
				System.out.println(getName() + " 실행");
			}
		};
		chatThread.setName("chat-thread");
		chatThread.start();

	}//

}//

스레드 상태

- 스레드 객체를 생성 (NEW) 하고 , start( ) 메소드를 호출하면 곧바로 실행이 아니라 실행대기상태 (RUNNABLE) 가 된다.

- 실행 대기하는 스레드는 CPU 스케쥴링에 따라 CPU를 점유하고 run( ) 메소드를 실행한다. 이때 실행상태 (RUNNING) 가 된다.

- 스케쥴링에 따라 실행상태와 실행 대기 상태를 번갈아가면서 run( ) 메소드를 조금씩 실행한다.

- 실행 상태에서 run( ) 메소드가 종료되면 더 이상 실행할 ㅋ코드가 없기때문에 종료상태 (TERMINATED) 가 된다.

- 실행 상태에서 일시정지 상태로 가기도 하는데 다시 실행대기 상태를 거친후 실행상태가 된다.

 

다른 스레드의 종료를 기다림

-ThreadA가 ThreadB의 join( ) 메소드를 호출하면 ThreadA는 ThreadB가 종료할 때까지 일시정지 상태가 된다.

 

다른 스레드에게 실행 양보

- 다른 스레드에게 실행을 양보하고 자신은 실행 대기 상태로 가는것 ( 프로그램 성능에 도움 )

- Thread.yield( );