본문 바로가기
Tech/Java

Java Thread, Multi Thread

by Dog발자. 2020. 6. 4.
반응형

- Thread ?

  • 프로세스 내부에서 독립적으로 실행하는 작업

  • JVM에 의해 프로세스가 발생하고 main()문의 실행도 하나의 Thread이다.

  • main() thread 이외에 다른 thread를 만들기위해 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현 하여 Thread를 생성할 수 있다.

※ Main Thread에서 다른 Thread가 발생 생성 되긴하지만 Main Thread에서 동작하는것은 아니다.

 

 

Thread 생성자 설명
Thread()  
Thread(String s) s : 스레드 이름
Thread(Runnable r) r : Runnable 인터페이스 객체
Thread(Runnable r, String s) r : Runnable 인터페이스 객체, s : 스레드 이름

 

Thread 메소드 설명
String getName() 스레드의 이름을 가져온다
void setName(String s) 스레드의 이름을 설정
void start() 스레드를 시작 run() 메소드 호출
int getPriority() 스레드의 우선 순위를 반환
void setpriority(int p) 스레드의 우선순위를 p값으로
boolean isAlive() 스레드가 시작되었고 아직 끝나지 않았으면 true 끝났으면 false 반환
void join() throws InterruptedException 스레드가 끝날 때 까지 대기
void run() 스레드가 실행할 부분 기술 (오버라이딩 사용)
void suspend() 스레드가 일시정지 resume()에 의해 다시시작 할 수 있다.
void resume() 일시 정지된 스레드를 다시 시작.
void yield() 다른 스레드에게 실행 상태를 양보하고 자신은 준비 상태로

https://jktech.tistory.com/11

 

JVM 더 깊이 있게 알아보자

- JDK (Java Development Kit) JDK 는 단어 그대로 자바 개볼 도구 이다 그래서 개발자들의 개발을 도와주는 도구들을 포함하고 있다 그리고 JRE을 포함호고 있다. 하지만 개발자가 아닌 일반 사용자들은

jktech.tistory.com

위에 링크에서 Java Threads(Java Stack) 내용을 보면 좀더 이해하기 쉽다.

 

Thread 사용법

1. Thread 를 상속 받아 run() 메소드르 직접 구현

public class TestThread extends Thread {
    @Override
    public void run() {
        System.out.println("RUN");
    }

    public static void main(String[] args){
        TestThread st = new TestThread();
        st.start();
    }
}

2. Runnable 인스턴스의 run() 메소드를 Override 하여 Thread에 객체를 할당하는 방식

public class TestRunnable implements Runnable {
    @Override
	public void run() {
        System.out.println("RUN");
    }

    public static void main(String[] args) {
        TestRunnable ct = new TestRunnable();
        Thread t = new Thread(ct,"1-thread");
        t.start();
    }
}

 

- Multi Thread

  • 복수의 Thread를 사용하여 동시에 여러 작업을 할 수 있는 기능 이다.

  • 자원을 공유할 수 있기 때문에 코드의 동기나 구조를 잘 고려 하지 안으면 난해해지고 서비스 플로우에 오류를 발생 시킬 수 있다.

  • 각각의 Thread는 개별 실행하는 프로그램이지만, 각각의 스레드는 서로 생성한 인스턴스를 공유해서 사용할 수 있다는 점이 별도의 프로그램을 돌리는 것과는 차이가 있다.

Thread Pool

  • 위 그림처럼 pool이라는 공간에 Thread를 미리 만드는 것

<장점>

  • Thread 생성/수거 하는 리소스가 들지 않느다.
  • 메모리 공간을 미리 확보한다.
  • 미리 생성된 Thread를 재사용 할 수 있으므로 자원의 낭비를 줄일 수 있다.
  • 작업처리 시 미리 Thread가 생성된 상테이므로 작업 딜레이를 줄일 수 있다.

<단점>

  • 쓸때 없이 Thread Pool에 Thread를 많이 생성해두면 메모리 낭비가 일어난다.
Thread Pool 종류 설명
newSingleThreadExecutor 1개의 쓰레드를 사용하는 쓰레드 풀
newCachedThreadPool 갯수의 제한이 없는 쓰레드 풀
newFixedThreadPool 갯수를 지정하여 사용하는 쓰레드 풀
newScheduledThreadPool 특정 시간 등을 지정하여 사용할 수 있는 쓰레드 풀.
newWorkStealingPool Java 1.8 에 새로 나온 쓰레드 풀인데 완전한 parallel 형태로 사용되는 쓰레드 풀
Thread Pool 메소드 설명
execute(Runable r) r: Runnable 인터페이스 객체
submit(Runable r),  submit(Callable) r : Runnable 인터페이스 객체, s : Callable 인터페이스 객체
public class ThreadPoolTest_1 {
	public static void main(String[] args) {
		// Threa
		ExecutorService service = Executors.newCachedThreadPool();
		ThreadTestRunable_1 runable = new ThreadTestRunable_1(1000);
		for (int i = 0 ; i<25; i++) {
			service.execute(runable);
		}
		System.out.println(">>>>>>>>>>>END");
	}
}

실행결과

>>>>>>>>>>>END
pool-1-thread-25----start
pool-1-thread-1----down price : 19000
pool-1-thread-25----down price : 18000
pool-1-thread-24----down price : 17000
pool-1-thread-23----down price : 16000
pool-1-thread-22----down price : 15000
pool-1-thread-21----down price : 14000
pool-1-thread-20----down price : 13000
pool-1-thread-19----down price : 12000
pool-1-thread-18----down price : 11000
pool-1-thread-17----down price : 10000
pool-1-thread-16----down price : 9000
pool-1-thread-15----down price : 8000
pool-1-thread-14----down price : 7000
pool-1-thread-13----down price : 6000
pool-1-thread-6----down price : 5000
pool-1-thread-12----down price : 4000
pool-1-thread-7----down price : 3000
pool-1-thread-11----down price : 2000
pool-1-thread-10----down price : 1000
pool-1-thread-9----down price : 0
pool-1-thread-2----down price : 0
pool-1-thread-8----down price : 0
pool-1-thread-3----down price : 0
pool-1-thread-4----down price : 0
pool-1-thread-5----down price : 0

 

public class ThreadPoolTest_2 {
	public static void main(String[] args) {
		ExecutorService service = Executors.newFixedThreadPool(10);
		ThreadTestCallable_1 callable = new ThreadTestCallable_1();
		for (int i=1; i<10; i++) {
			Future<Integer> return_value = service.submit(callable);
			try {
				int get_number =  return_value.get();
				
				System.out.println("Callable Return Value : "+ get_number);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
		}
		System.out.println(">>>>>>>>>>>>>>END");
	}
}

 

실행결과

Callable ----- pool-1-thread-1
Callable Return Value : 9100
Callable ----- pool-1-thread-2
Callable Return Value : 8200
Callable ----- pool-1-thread-3
Callable Return Value : 7300
Callable ----- pool-1-thread-4
Callable Return Value : 6400
Callable ----- pool-1-thread-5
Callable Return Value : 5500
Callable ----- pool-1-thread-6
Callable Return Value : 4600
Callable ----- pool-1-thread-7
Callable Return Value : 3700
Callable ----- pool-1-thread-8
Callable Return Value : 2800
Callable ----- pool-1-thread-9
Callable Return Value : 1900
>>>>>>>>>>>>>>END

Future 객체?

Future 객체는 작업 결과가 아니라 작업이 완료될 때까지 기다렸다가 최종 결과를 얻는데 사용합니다. 그래서 Future는 지연 완료(pending Completion) 객체라고 합니다. Future의 get() 메소드를 호출하면 스레드가 작업을 완료할 때까지 블로킹되었다가 작업을 완료하면 처리 결과를 리턴합니다. 이것이 블로킹을 사용하는 작업 완료 통보 방식입니다.

 

※ Future<T> future : 비동기로 수행된 쓰레드의 결과를 담을 목록

 

ThreadPoolTest_1.java VS ThreadPoolTest_2.java

위 결과 값을 보면 END 메세지가 출력된 타이밍이 다른것을 알 수 있다. 그리고 thread-X 의 발생 순서도 다른것을 확인 할 수 있다. 그래서 왜그런지 이유를 찾기위해 두 코드의 차이 점을 찾아보았다
두코드의 차이는 Test_1은 Runnable 을 사용하였고 Test_2은 Callable 사용 하였다 그리고 가장큰 차이점은 Future 사용 하여 Callable 결과 값을 가져왔다는것이다. Future 의 get() 메소드를 호출하여 스레드가 작업을 완료할 때까지 블로킹되었기 때문에 위 결과 차이를 보이게 된 것이다. 그렇게 때문에 ThreadPoolTest_2.java 에서 Future 의 get()을 주석 처리하면 비슷한 결과를 얻을 수 있다.

 

 

github.com/jkkim09/JAVA-TEST/tree/master/src/main/java/java_test/thread

 

jkkim09/JAVA-BASE

💥 Java / 리마인드 정리. Contribute to jkkim09/JAVA-BASE development by creating an account on GitHub.

github.com

 

반응형

'Tech > Java' 카테고리의 다른 글

Java Annotation (어노테이션)  (2) 2020.06.03
싱글톤 패턴(Singleton Pattern)  (0) 2020.06.02
Java 자료구조 - List, Set, Map  (1) 2020.05.30
Java 자료구조 - Queue  (0) 2020.05.25
Java 자료구조 - Stack  (0) 2020.05.25

댓글