Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch15. 자바 Thread 프로그래밍 (1) 본문

JAVA 문법

Ch15. 자바 Thread 프로그래밍 (1)

밍응애 2021. 2. 14. 14:12
  • 자바의 Thread 클래스를 상속받아 Thread 프로그래밍을 하거나, Runnable 인터페이스 구현하여 가능
  • Multi Thread 구현
  • Shared Resource (공유자원) --> 동시에 쓰면 문제가 생길 수 있음 --> syncronization(동기화)로 순서를 맞춰줌

 

< Thread 구현하기 >

* Thread란?

- Process : 프로그램이 메모리에 올라간 상태

- Thread : Process가 실행이 되는 게 아니라, 실행이 되는 단위는 Thread(작업의 단위) / 하나의 프로세스는 하나 이상의 Thread를 가짐 / CPU를 점유해서 돌아감(스케줄러가 Thread에 CPU를 할당)

 

* Thread 구현하기

- 자바의 Thread 클래스 extends(상속)

 

- Runnable 인터페이스 implements(구현)

: extends 키워드 뒤에는 클래스가 하나밖에 올 수 없으므로(다중상속X), 이미 어떤 클래스를 상속받고 있다면 이렇게 runnable이라는 인터페이스를 implements 하면 됨!

 

- 예제 1)

# MyThread 클래스 - Thread 클래스 상속

package ch15.thread;

class MyThread extends Thread{
	
	public void run() {
		int i;
		
		for(i=0; i<=200; i++) {
			System.out.print(i + "\t");
			
			try {
				sleep(10);	//thread 클래스의 static 메서드
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class ThreadTest {

	public static void main(String[] args) {
		
		System.out.println("start");
		
		MyThread th1 = new MyThread();
		MyThread th2 = new MyThread();
		
		th1.start();
		th2.start();
		System.out.println("end");
		
	}

}

--> main을 실행하면 th1, th2 그리고 main까지 thread 3개가 실행이 되며, main thread가 가장 먼저 종료됨

 

- 예제 2)

#MyThread 클래스 - Runnable 인터페이스 구현

package ch15.thread;

class MyThread implements Runnable{

	@Override
	public void run() {
		int i;
		
		for(i=0; i<=200; i++) {
			System.out.print(i + "\t");
			
			try {
				Thread.sleep(10);	//thread 클래스의 static 메서드
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

public class ThreadTest {

	public static void main(String[] args) {
		
		System.out.println("start");
		
		MyThread runner1 = new MyThread();
		Thread th1 = new Thread(runner1);
		th1.start();
		
		MyThread runner2 = new MyThread();
		Thread th2 = new Thread(runner2);
		th2.start();
		
		System.out.println("end");
		
	}

}

--> Runnable 인터페이스를 구현한 경우, 다음과 같이 Thread 객체를 생성할 때 생성자에 전달하는 인자로 Runnable 객체를 넣어준 후, Thread 객체를 start한다

 

* Multi-thread 프로그래밍

- 동시에 여러개의 Thread가 수행되는 프로그래밍

- Thread는 각각의 작업공간(Context라고 함)을 가진다

(Thread가 스위치되면, Context도 스위치됨)

- 공유자원에 여러 개의 Thread가 동시접근하면? race condition 발생!

ex) 두 개의 Thread가 있고, 이 때 Thread1은 값을 더하고 Thread2는값을 뺀다고 치자.

     이 때 Thread1이 어떤 값을 critical section(공유자원이 있는 섹션)에서 가져와서 더하고 있는 중

     Thread2가 동시에 빼버린다면 나중에 Thread1이 결과로 낸 값을 오버라이딩한 것이 무시될 수 있음

     (Thread1이 먼저 더한 이후에 Thread2가 빼야 하는데)

==>이러한 critical section 영역에 대해 순서를 지켜주자는 것이 동기화

(Java에서는 이를 위해 syncronized라는 키워드가 제공됨) 

==> critical section에 들어갈 수 있는 Thread는 한번에 한개여야 함!

 

 

 

 

storage.googleapis.com/static.fastcampus.co.kr/prod/uploads/202101/172902-53/[%ED%8C%A8%EC%8A%A4%ED%8A%B8%EC%BA%A0%ED%8D%BC%EC%8A%A4]-%EA%B5%90%EC%9C%A1%EA%B3%BC%EC%A0%95%EC%86%8C%EA%B0%9C%EC%84%9C-java-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EB%A7%88%EC%8A%A4%ED%84%B0-%EC%98%AC%EC%9D%B8%EC%9B%90-%ED%8C%A8%ED%82%A4%EC%A7%80-online..pdf

 

'JAVA 문법' 카테고리의 다른 글

Ch15. 자바 Thread 프로그래밍 (4) - multi-thread 프로그래밍  (0) 2021.02.14
Ch15. 자바 Thread 프로그래밍 (3)  (0) 2021.02.14
Ch13. 예외 처리  (0) 2021.02.09
Ch12. 스트림 (2)  (0) 2021.02.06
Ch12. 스트림 (1)  (0) 2021.02.06