Super Coding Addict
Ch15. 자바 Thread 프로그래밍 (1) 본문
- 자바의 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는 한번에 한개여야 함!
'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 |