본문 바로가기

웹 개발/Java

[Web_JAVA] 37

프로그램

- 소스코드로 잘 짜여진 틀

- 실행이 안 된 상태

 

 

 

● 프로세스

- 실행된 프로그램

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

- JAVA는 운영체제가 바로 실행시켜주지 않고 JVM에 의해 실행되기 때문에 JVM으로부터 시스템 자원을 할당받는다.

 

 

 

● 쓰레드

- 프로세스의 처리 경로

- 멀티 쓰레드를 구현할 때에는 스케줄링 작업이 필요하다.

 

1. 단일 쓰레드

- 처리 경로를 한 개만 가지고 있기 때문에 직렬적이다.

- 동시에 많은 양을 처리하기 힘들기 때문에 상대적으로 비효율적이다.

- 하지만 하나의 작업에 문제가 발생하더라도 다른 작업에는 영향을 끼치지 않는다.

- 따라서 안정성이 보장되고 설계 시 멀티 쓰레드에 비해 쉽다.

 

 

2. 멀티 쓰레드

- 하나의 프로세스를 동시에 처리하는 것처럼 보이지만 사실은 매우 짧은 단위로 분할해서 차례로 처리한다.

- 여러 개의 처리 경로를 가질 수 있도록 하며, 동시 작업이 가능해진다.

- 설계하기 굉장히 어려우며, 하나의 쓰레드 문제 발생 시 모든 쓰레드에 문제가 발생하게 된다.

- JAVA 웹 서버가 대표적인 멀티 쓰레드이다.

- 멀티 쓰레드로 설계했다면 처리량 증가, 효율성 증가, 처리비용 감소의 장점이 있기 때문에 단점을 감수하고 설계하는 편이다.

 

 

 

● 멀티 쓰레드의 최대 단점 : 교착 상태(Deadlock)

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

- 교착상태인 지를 판단했다면 전체 쓰레드를 깨워주거나, 하나의 쓰레드를 종료시켜주면 교착상태가 해결된다.

 


 

● 멀티 쓰레드 구현 방법

** 핵심 : run() 메소드 재정의, 구현

 

1. Thread 클래스 상속

 

2. Runnable 인터페이스 지정

 

 


 

 

실습(Thread(1))

1. Thread 클래스를 상속받는 Thread1.java 생성

public class Thread1 extends Thread{

	String data;
	
	public Thread1() {;}

	public Thread1(String data) {
		super();
		this.data = data;
	}
	
	@Override
	public void run() {  // 자원
		for (int i = 0; i < 5; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {;}
			
			System.out.println(data);
		}
	}
	
}

 

 

 

2. ThreadTest.java에서 실행

public class ThreadTest {
	public static void main(String[] args) {
      
		Thread1 t1 = new Thread1("★");
		Thread1 t2 = new Thread1("♥");
      
		// 멀티 쓰레드는 무조건 start() 메소드를 사용한다.
		// start() : Thread 클래스에 선언된 메소드
		t1.start();
		t2.start();
      
   }
}

 

결과

 

 

 

 

실습(Thread(2))

1. Runnable 인터페이스를 구현한 Thread2.java 생성

public class Thread2 implements Runnable{
   
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
    	  
			// 객체화할 때 등록할 이름
			System.out.println(Thread.currentThread().getName());
			try {Thread.sleep(500);} catch (InterruptedException e) {;}

		}
	}

}

 

 

 

2. ThreadTest.java에서 실행

public class ThreadTest {
	public static void main(String[] args) {
		
//		Runnable t1 = new Thread2(); 
//		Thread2 t2 = new Thread2();
//		Thread thread1 = new Thread(t1, "!");
//		Thread thread2 = new Thread(t2, "?");


		// start() 메소드를 사용하기 위해 Thread 객체를 생성해야 한다.
		Thread thread1 = new Thread(()->{
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName());
				try {Thread.sleep(500);} catch (InterruptedException e) {;}
			}
		}, "!") ;
		Thread thread2 = new Thread(()->{
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName());
				try {Thread.sleep(500);} catch (InterruptedException e) {;}
			}
		}, "?");

		
		// join() : 사용한 쓰레드가 다 끝나야 다른 쓰레드가 동작한다.
		// 먼저 실행할 곳에 join()을 사용한다.
		
		thread1.start();
		thread2.start();
		
		try {
			thread1.join();
			thread2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
      
		System.out.println("main 쓰레드 종료");
      
   }
}

 

결과
 
 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 39  (0) 2022.03.25
[Web_JAVA] 38  (0) 2022.03.24
[Web_JAVA] 36  (0) 2022.03.22
[Web_JAVA] 35  (0) 2022.03.21
[Web_JAVA] 34  (0) 2022.03.20