Java Class Notes
Thread(스레드)
헤일리유
2023. 3. 10. 17:28
Thread(쓰레드)
Process and Thread
프로그램 ----- 실행 -----> 프로세스
프로그램 : 실행 가능한 파일(HDD)
프로세스 : 실행 중인 프로그램(메모리)
Thread in Java
- 하나의 프로그램이 동시에 여러 개의 일을 수행할 수 있도록 해 주는것
- 순차적으로 동작하는 문장들의 단일 집합
- 경량(lightweight) 프로세스
- 다중 스레드
- 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성하 여 실행할 때 - 자바는 스레드를 지원하기 위해 java.lang.Thread 클래스 제공
Process and Thread
Process : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성
Thread : 프로세스 내에서 실제 작업을 수행.
모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.
프로세스 : 쓰레드 = 공장 : 일꾼
Multi-process and Multi-thread
하나의 새로운 프로세스를 생성하는 것보다
하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
Multi-thread
- 동시성
- 멀티작업위해하나의코어에서멀티스레드가번갈아가며실행하는성질 - 병렬성
- 멀티작업을위해멀티코어에서개별스레드를동시에실행하는성질
Pros and Cons of Multi-thread
Pros | Cons |
“여러 모로 좋다.” |
“프로그래밍할 때 고려해야 할 사항들이 많다.”
|
- 자원을 보다 효율적으로 사용할 수 있다 | - 동기화(synchronization)에 주의해야 한다. |
- 사용자에 대한 응답성(responseness)이 향상된다. | - 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다. |
- 작업이 분리되어 코드가 간결해 진다. | - 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다. |
Multi-tasking (멀티태스킹)
멀티 태스킹이란?
- 컴퓨터에서 각각의 일을 전담하는 해당 프로그램들(여러 개의 프로세스 (Process))이 동시에 실행되는 것.
멀티 태스킹을 위해 운영체제가 취하는 방식이 멀티 프로세스 시스템이다.
스케줄링(Scheduling)이란?
- 멀티프로세스 시스템에서 각 프로세스는 동시에 실행되는것 처럼 보이지만, CPU가 하나이기 때문에 실행시간을 잘게 나누어 프로세스가 돌아가는데 각 프로세스들이 돌아가면서 CPU를 점유하는데 프로세스간 CPU점유작업을 말함.
Thread class
- JDK는 스레드를 지원하는 java.lang.Thread 클래스 제공
- 스레드를 생성하기 위해 사용
- 4개의 생성자를 제공
Thread()
Thread(String s)
Thread(Runnable r)
Thread(Runnable r, String s)
Thread Class Methods | 메소드가 하는 일 | |
void sleep(long msec) | msec에 지정된 밀리초(milliseconds) 동안 대기 | |
throws InterruptedException void sleep(long msec, int nsec) InterruptedException |
msec에 지정된 밀리초+nsec에 지정된 throws 나노초(nanoseconds) 동안 대기 | |
String getName() void setName(String s) |
스레드의 이름을 반환 스레드의 이름을 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() | 일시 정지된 스레드를 다시 시작시킨다. |
Thread 생성
- Thread 클래스로부터 직접 상속받아 스레드 를 생성
- Runnable 인터페이스를 사용하는 방법(현 재의 클래스가 이미 다른 클래스로부터 상속 받고 있는 경우)
Thread 클래스 이용
- Thread 클래스를 상속받은 뒤, 해당 스레드에서 지원하고 싶은 코드를 run()메서드에서 오버라이딩 해준다.
- 해당 스레드를 생성한 후, 스레드 객체의 start()메서드를 호출한다.
class ThreadA extends Thread { // Thread 클래스로부터 상속
.........
public void run() {
.... // 상위 클래스인 Thread 클래스의 run() 메서드를 오버
.... //라이딩하여스레드가수행하여야하는문장들을기술
}
.......
}
ThreadA ta = new ThreadA();
ta.start();
// 스레드 객체를 생성하여 스레드를
// 시작시킨다
Ex - ThreadEx1
1. thread 사용 X
package ch12;
class Thread1 extends Thread {
public void run() {
for (int i=0; i<100; i++) { // thread를 실행하는 메서드
System.out.print("Thread"+i+"\t");
if (i%9 ==0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
public class ThreadEx1 {
public static void main(String[] args) {
Thread1 th1 = new Thread1();
th1.run();
// th1.start();
for (int i=0; i<100; i++) {
System.out.print("Main"+i+"\t");
if (i%9 == 0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
>>> 느림, 순차적 (slower, in order)
2. thread 사용
package ch12;
class Thread1 extends Thread {
public void run() {
for (int i=0; i<100; i++) { // thread를 실행하는 메서드
System.out.print("Thread"+i+"\t");
if (i%9 ==0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
public class ThreadEx1 {
public static void main(String[] args) {
Thread1 th1 = new Thread1();
// th1.run();
th1.start();
for (int i=0; i<100; i++) {
System.out.print("Main"+i+"\t");
if (i%9 == 0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
Main0
Thread0
Main1 Thread1 Thread2 Main2 Main3 Thread3 Thread4 Main4 Thread5 Main5 Thread6 Main6 Thread7 Main7 Main8 Thread8 Main9
Thread9
Thread10 Main10 Thread11 Main11 Thread12 Main12 Thread13 Main13 Thread14 Main14 Thread15 Main15 Main16 Thread16 Thread17 Main17 Thread18
Main18
Thread19 Main19 Thread20 Main20 Main21 Thread21 Main22 Thread22 Main23 Thread23 Thread24 Main24 Thread25 Main25 Thread26 Main26 Thread27
Main27
Thread28 Main28 Thread29 Main29 Thread30 Main30 Thread31 Main31 Main32 Thread32 Main33 Thread33 Thread34 Main34 Thread35 Main35 Thread36
Main36
Main37 Thread37 Main38 Thread38 Thread39 Main39 Thread40 Main40 Thread41 Main41 Thread42 Main42 Thread43 Main43 Thread44 Main44 Main45
Thread45
Main46 Thread46 Thread47 Main47 Thread48 Main48 Thread49 Main49 Thread50 Main50 Thread51 Main51 Thread52 Main52 Thread53 Main53 Thread54
Main54
Thread55 Main55 Thread56 Main56 Thread57 Main57 Thread58 Main58 Thread59 Main59 Thread60 Main60 Thread61 Main61 Thread62 Main62 Thread63
Main63
Thread64 Main64 Thread65 Main65 Thread66 Main66 Thread67 Main67 Thread68 Main68 Thread69 Main69 Thread70 Main70 Thread71 Main71 Thread72
Main72
Thread73 Main73 Thread74 Main74 Thread75 Main75 Thread76 Main76 Thread77 Main77 Thread78 Main78 Thread79 Main79 Thread80 Main80 Thread81
Main81
Thread82 Main82 Thread83 Main83 Thread84 Main84 Thread85 Main85 Thread86 Main86 Thread87 Main87 Thread88 Main88 Thread89 Main89 Thread90
Main90
Thread91 Main91 Thread92 Main92 Thread93 Main93 Thread94 Main94 Thread95 Main95 Thread96 Main96 Thread97 Main97 Thread98 Main98 Thread99
Main99
>> faster , not in order
2. 3D thread
package ch12;
class Thread1 extends Thread {
public Thread1(String title) {
super(title);
}
public void run() {
for (int i=0; i<100; i++) { // thread를 실행하는 메서드
System.out.print(getName()+i+"\t");
if (i%9 ==0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
public class ThreadEx1 {
public static void main(String[] args) {
Thread1 th1 = new Thread1("th1");
Thread1 th2 = new Thread1("th2");
// th1.run();
th1.start(); th2.start();
for (int i=0; i<100; i++) {
System.out.print("Main"+i+"\t");
if (i%9 == 0) System.out.println();
try {
Thread.sleep(500); // .5초 쉬어라 단위 1/1000초
} catch (InterruptedException e) {}
}
}
}
Main0
th10
th20
Main1 th21 th11 th22 th12 Main2 th13 Main3 th23 th14 Main4 th24 th15 Main5 th25 th16 th26 Main6 th17 th27 Main7 th18 th28 Main8 th19
th29
Main9
th110 th210 Main10 th111 th211 Main11 th112 th212 Main12 th113 th213 Main13 th114 Main14 th214 th115 Main15 th215 th216 th116 Main16 th117 Main17 th217 th118
Main18
th218
th119 Main19 th219 Main20 th220 th120 Main21 th221 th121 Main22 th122 th222 Main23 th123 th223 Main24 th224 th124 Main25 th125 th225 Main26 th126 th226 th127
Main27
th227
th228 th128 Main28 Main29 th129 th229 th130 Main30 th230 th131 Main31 th231 Main32 th232 th132 th233 th133 Main33 th234 th134 Main34 Main35 th135 th235 Main36
th136
th236
Main37 th137 th237 Main38 th138 th238 Main39 th139 th239 Main40 th140 th240 Main41 th141 th241 Main42 th142 th242 Main43 th143 th243 Main44 th144 th244 Main45
th145
th245
Main46 th146 th246 Main47 th147 th247 Main48 th148 th248 Main49 th149 th249 Main50 th250 th150 Main51 th251 th151 Main52 th152 th252 Main53 th153 th253 Main54
th254
th154
Main55 th255 th155 Main56 th156 th256 Main57 th157 th257 Main58 th258 th158 Main59 th159 th259 Main60 th260 th160 Main61 th161 th261 Main62 th262 th162 Main63
th263
th163
Main64 th264 th164 Main65 th265 th165 Main66 th166 th266 Main67 th267 th167 Main68 th168 th268 Main69 th169 th269 Main70 th270 th170 Main71 th271 th171 Main72
th272
th172
Main73 th273 th173 Main74 th274 th174 Main75 th175 th275 Main76 th176 th276 Main77 th177 th277 Main78 th178 th278 Main79 th279 th179 Main80 th180 th280 Main81
th281
th181
Main82 th282 th182 Main83 th283 th183 Main84 th284 th184 Main85 th185 th285 Main86 th286 th186 Main87 th287 th187 Main88 th288 th188 Main89 th289 th189 Main90
th290
th190
Main91 th291 th191 Main92 th292 th192 Main93 th293 th193 Main94 th294 th194 Main95 th295 th195 Main96 th296 th196 Main97 th297 th197 Main98 th198 th298 Main99
th299
th199