sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
40. 스레드 (Thread)
1) 스레드에서의 Synchronization : 데이터무결성을 유지하기 위한 방편 (이것이 유지되지 못하면 race condition에 빠진다)
2) Synchronization 키워드는 메소드가 수행되는 동안 그 메소드가 완전히 실행이 멈추는 순간까지 스레드간에 공유되는 객체의 상태를 다른스레드의 접근으로부터 보호한다.(lock)
3) 보통 Synchronized 키워드는 메소드 수준에서 사용하며 이것을 사용자 지정 영역에서도 사용 가능하다.(Synchroized block) 이런경우 스레드 스케쥴링에 있어 매우 민감하게 작용되므로 주의를 요한다.
4) Starvation은 Synchronized 키워드에 의해 lock된 메소드가 CPU를 무한 독점함으로써 발생한다.
5) Dead lock은 Synchronized 키워드에 의해 서로 lock된 스레드간에 서로의 자원을 접근하려 할 경우 발생한다.
6) join()메소드는 현재 실행되는 스레드가 종료할때까지 main을 block한다.
(다른스레드가 종료해야만 join메소드 이후의 명령이 수행됨)
ex) t.start();
t.join(); => 다른 스레드가 종료하기전에는 t의 스레드가 실행되지 않는다.
int j = t.i;
7) 자바에서의 thread사용은 thread클래스를 상속(extend)받아 run메소드를 override하는 방법과 Runnable 인터페이스를 implements하여 run메소드를 구현하는 방법 2가지가 있다.
8) 현재 실행중인 스레드를 강제적으로 멈추게하는 메소드나 방법은?
① stop() ... 멈추다
② wait() ... 기다리다
③ yeild() ... 잠시휴식
④ setpriority() ... 우선권변경 ex) t1.setpriority(Thread.MAX_PRIORITY)
⑤ main프로그램 실행
⑥ IO장치사용(인터럽트)
⑦ 다른스레드 start
9) 스레드의 wait()메소드에서 일어날수도 있는 Exception은 Interupted Exception이다.
10) synchronized 키워드에 의해 lock된 메소드에서는 wait()메소드를 호출하여 현재 스레드가 작업을 수행할 수 없는 동안 작업중인 다른스레드의 lock된 메소드가 종료할때까지 현재스레드를 대기상태로 만들어준다.
/**
* 두 개의 조건을 이용한 스레드의 종료
*/
class ControlThread extends Thread{
//모든 스레드의 종류를 제어하는 플래그
public static boolean all_exit = false;
//스레드의 종류를 제어하는 플래그
private boolean flag = false;
public void run(){
int count = 0;
System.out.println(this.getName() + "시작");
//flag나 all_exit 둘 중 하나만 true이면 while문이 끝난다.
while(!flag && !all_exit){
try{
//작업
this.sleep(100);
}catch(InterruptedException e){}
}
System.out.println(this.getName() + "종료");
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
public class ControlThreadMain {
public static void main(String[] args){
System.out.println("작업시작");
ControlThread a = new ControlThread();
ControlThread b = new ControlThread();
ControlThread c = new ControlThread();
a.start();
b.start();
c.start();
try{
Thread.sleep(100);
}catch(Exception e){}
int i;
System.out.print("종로할 스레드를 입력하시오! A, B, C, M?\n");
try{
while(true){
i = System.in.read();
if( i == 'A'){
a.setFlag(true);
}else if(i == 'B'){
b.setFlag(true);
}else if(i == 'C'){
c.setFlag(true);
}else if(i == 'M'){
//모든 스레드를 종료시킨다.
ControlThread.all_exit = true;
System.out.println("main종료");
break;
}
}
}catch(Exception e){}
}
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
43 | JDF(Java Development Framework) 관련 | 황제낙엽 | 2004.02.11 | 505 |
42 | JDBC Date 포맷 변환 | 황제낙엽 | 2003.11.08 | 938 |
41 | Connection 리소스 관리시 주의해야 할 점 | 황제낙엽 | 2003.09.06 | 429 |
40 | XSLTFilter ... (퍼옴) | 황제낙엽 | 2003.07.21 | 634 |
39 | (초보탈출 II) 내부클래스 | 황제낙엽 | 2003.05.20 | 505 |
38 | (초보탈출 I) 패키지 | 황제낙엽 | 2003.05.20 | 544 |
37 | 열네번째날 (화상 채팅 프로그램 프로젝트) | 황제낙엽 | 2003.04.21 | 945 |
36 | 열세번째날 - WEB APPLICATION | 황제낙엽 | 2003.04.15 | 824 |
35 | 열두번째날 - I/O | 황제낙엽 | 2003.04.15 | 285 |
» | 열하나째날 - 스레드 | 황제낙엽 | 2003.04.15 | 330 |
33 | 열번째날 - 애플릿과 그래픽 | 황제낙엽 | 2003.04.15 | 617 |
32 | 아홉째날 - SWING | 황제낙엽 | 2003.04.15 | 542 |
31 | 여덟째날 - 예외처리 | 황제낙엽 | 2003.04.14 | 527 |
30 | 일곱째날 - EVENT | 황제낙엽 | 2003.04.14 | 245 |
29 | 여섯째날 - AWT | 황제낙엽 | 2003.04.14 | 628 |
28 | 다섯째날 - Collection, String, StringBuffer | 황제낙엽 | 2003.04.14 | 562 |
27 | 넷째날 - 추상클래스, 내부클래스, Interface, Static영역 | 황제낙엽 | 2003.04.14 | 566 |
26 | 셋째날 - 패키지, 상속, 접근제어 | 황제낙엽 | 2003.04.14 | 509 |
25 | 둘째날 - 클래스, 메서드, 연산자 | 황제낙엽 | 2003.04.14 | 482 |
24 | 첫째날 - 자바의 특징과 DATA TYPE | 황제낙엽 | 2003.04.14 | 457 |