Back-End/JAVA

[Java] Thread(쓰레드)

챌링킴 2021. 6. 1. 21:34
반응형

1. 프로그램

   잘 짜여진 틀

 

2. 프로세스

   실행된 프로그램

   운영체제로부터 시스템 자원을 할당받는 작업의 단위

   자바 프로그램은 운영체제 대신 JVM에 의해 자원을 할당받는다.

 

1) Thread(쓰레드)

1. (단일)쓰레드

   프로세스의 특정한 수행 경로

   프로그램의 처리 경로

   프로그램의 흐름

 

2. 멀티 쓰레드

   하나의 프로세스를 동시에 처리하는 것처럼 보이지만,

   사실은 매우 짧은 단위로 분할해서 차례로 처리한다.

   병렬적 구조

 

   여러개의 처리경로를 가질 수 있다.

   한개의 처리경로를 여러개로 나누어 동시 작업이 가능해진다.

   웹 페이지(JSP)가 대표적인 멀티 쓰레드 응용 프로그램이다.

 

2) 쓰레드 장단점

1. 장점

   효율성 증가

   처리량 증가

   처리비용 감소

 

2. 단점

   복잡하고 구현과 설계가 어려움

   하나의 쓰레드 문제 발생시 전부 다 문제가 발생함

   교착상태(Deadlock)

 

**교착상태(Deadlock)란?

더보기

멀티 쓰레드 중 쓰레드 간에 대기 상태가 종료되지 않아서 무한정 대기만 하는 비정상적인 상태

대비 방법 => 제어문을 통해 교착상태를 파악하고 판단하여 다시 깨워준다.

 

3) 쓰레드 생성 방법

1. Thread 클래스 상속

public class MyThread extends Thread {
	String data;

	public MyThread(String data) {
		this.data = data;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(data);
			// Thread.sleep(밀리초) : 해당 밀리초만큼 진행 멈추기
			// 1000millis가 1초
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}
public class ThreadMain {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("☆");
		MyThread t2 = new MyThread("★");

//		t1.run();
//		t2.run(); // 이건 단일 쓰레드
		
		System.out.println("두개의 쓰레드 시작");
		
		t1.start();
		t2.start(); // 이렇게 해야 멀티 쓰레드

		try {
			t1.join();
			t2.join();
		} catch (InterruptedException e) {
		}

		System.out.println("멀티 쓰레드 종료");
	}
}

 

2. Runnable 인터페이스 지정 후 Thread에 넘겨주기

public class MyRunnable implements Runnable {

	String data;

	public MyRunnable(String data) {
		super();
		this.data = data;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(data);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				;
			}
		}
	}
}
public class ThreadMain {
	public static void main(String[] args) {
		MyRunnable r1 = new MyRunnable("♡");
		MyRunnable r2 = new MyRunnable("♥");
		
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		
		t1.start();
		t2.start();
	}
}

 

4) 동기화(synchronized)

   하나의 쓰레드가 실행 중일 때 다른 쓰레드가 동시에 같은 필드를 사용하지 못하게 막는 것

   각 쓰레드를 개발자가 직접 제어하기 위해 사용한다.

   자원의 공유문제를 해결하기 위함

 

   synchronized(this){

        //다른 쓰레드가 동시에 사용 불가

   }

반응형

'Back-End > JAVA' 카테고리의 다른 글

[Java] MVC 모델  (0) 2021.06.03
[Java] 파일 입출력  (0) 2021.06.02
[Java] 빠른 for문  (0) 2021.06.01
[Java] HashMap  (0) 2021.06.01
[Java] HashSet  (0) 2021.06.01