티스토리 뷰
package day19;
public class Thread10 { //메인 클래스
public static void main(String[] args) {
Runnable r = new Money(); //쓰레드를 호출한 클래스 객체화
new Thread(r).start(); //쓰레드 실행A
new Thread(r).start(); //쓰레드 실행B
}
}
class Account {
private int balance = 1000; //은행잔고
public String name;
public int getBalance() { //호출을 하기 위해 get 설정, 수정할 이유X set 설정X
return balance;
}
public synchronized void withdraw(int money) {
if(balance >= money) {
try {Thread.sleep(1000);} catch (InterruptedException e) {} //Thread sleep
balance -=money; //출금
}
} //withdraw 메서드 라인
} //Account 클래스 라인
class Money implements Runnable{ //Runnable을 사용하는 이유 : 멀티쓰레드를 사용하기 위해
Account acc = new Account(); //클래스 객체화
public void run() { //쓰레드 설정
while(acc.getBalance()>0) { //은행잔고의 잔액이 존재할 경우 반복문 실행
int money = (int)(Math.random()*3+1)*100 ; //100,200,300 중 출금할 예정
acc.withdraw(money);// 랜덤으로 withdraw 메서드를 이용하여 출금
System.out.println("잔액 : "+acc.getBalance()); //출금 후 잔액 표시
}
} //run
} //Money 클래스 라인
package day19;
public class Thread11 {
public static void main(String[] args) {
ThreadF f = new ThreadF();
f.start();
synchronized (f) {
try {
System.out.println("f가 완료될때까지 기다립니다.");
f.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("Total is :"+f.total);
}
}
}
class ThreadF extends Thread {
int total;
public void run() {
synchronized (this) {
for(int i=0;i<5;i++) {
System.out.println(i+"를 더합니다.");
total +=i;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify(); //중단된 쓰레드가 락을 다시 얻어 작업을 한다.
}
}
}
※개념정리
멀티쓰레드의 경우 작업의 의도와 결과가 다르게 되는 것을 방지하기 위해 하나의 쓰레드가 특정작업을 마치기 전까지 다른 쓰레드한테 방해받지 않기 위해 '임계영역'과'락'을 정의했다.
임계영역 : 공유데이터를 사용하는 코드 영역
임계영역을 지정한 쓰레드는 공유데이터가 가지고 있는 락을 획득하여 단 하나의 쓰레드만 코드를 수행할 수 있으며,
반납시 다른 스레드가 락을 획득해야 임계영역을 수행할 수 있다.
동기화 : 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것
동기화 방법
1) synchronized
1. 메서드 앞에 synchronized을 붙인다.
public synchronized void cal() {
//... 임계영역
}
2.특정한 영역을 임계영역으로 지정 (추천)
synchronized(객체의 참조변수) {
//... 임계영역
}
임계영역은 멀티쓰레드의 프로그램 성능을 좌우하므로 메서드 전체보단 synchronized블럭으로 임계영역을 최소화 하는 것이 효율적이다.
2) wait( ), notify( ), notifyAll( )
특정쓰레드가 객체의 락을 가진 상태로 오랜 시간을 보내지 않는게 중요
synchronized블록에서 존재하며, wait( )에 의해 lock을 반납했다가 다시 lock를 얻어서 임계영역을 들어오는 것을 재진입이라고 한다.
wait( ) 의 매개변수가 있을 경우 그 시간이 지난후에 자동으로 notify( )가 호출된다.
notify( )가 호출되면, 해당 객체의 대기실에 있던 모든 쓰레드 중에 임의의 쓰레드만 호출
notifyAll( )가 호출되면, 기다리고 있는 모든 쓰레드가 호출
'Java > 개념' 카테고리의 다른 글
JAVA 쓰레드의 상태제어(=실행제어) (0) | 2020.07.14 |
---|---|
JAVA 쓰레드의 우선순위 (0) | 2020.07.14 |
JAVA 싱글쓰레드와 멀티쓰레드의 차이점 (0) | 2020.07.14 |
JAVA Thread(쓰레드)의 개념 및 구현방법 (0) | 2020.07.14 |
JAVA/HashMap과LinkedHashMap과TreeMap의 비교 (0) | 2020.05.30 |
- Total
- Today
- Yesterday
- JAVA #Thread #쓰레드 #싱글쓰레드 #멀티쓰레드 #자바
- JAVA #Thread #쓰레드 #자바 #sychronized #wait #notify #notifyAll #lock #잠금 #동기화 #임계영역
- Process #쓰레드
- 10998 #A*B #AxB
- 정보처리기사 #2020년개정 #UML #다이어그램 #정적 #동적 #구조적 #행위 #실체화 #구조 #관계 #의존 #연관 #집합 #포함 #일반화
- JAVA #CollectionFramework #Set #HashESet #TreeSet #LinkedHashSet
- 백준 #JAVA #1000번 #Scanner #Buffered #입력함수
- 백준 #2557 #HelloWorld! #JAVA
- 정보처리기사 #2020년 개정 #SW설계 #요구사항 확인 #애자일 #스크럼
- JAVA #HashMpa #Map #Hashtable #Hashing
- NEW #BLOCKED #TERMINATED #WAITING #TIMED WAITING #RUNNABLE
- JAVA #CollectionFramework #Set #Treeset
- JAVA #Map #HashMap #TreeMap #LinkedHashMap
- 정보처리기사 #2020년개정 #요구사항 분석기법 #요구사항 확인기법
- 정보처리기사 #2020년 개정 #XP #익스트림프로그래밍 #릴리즈 #이터레이션 #방법론
- 정보처리기사 #2020개정 #SW설계 #현행시스템
- JAVA #CollectionFramework #List #ArrayList #LinkedList #for-each #foreach #iterator #Iterator #반복자
- JAVA #Thread #Runnable
- 백준 #1001번 #A-B
- 정보처리기사 #2020년개정 #요구사항확인 #1과목 #SW생명주기 #폭포수 #SW설계 #나선형 #애자일 #프로포타입
- 백준 #Java #10926 #??!
- 포토시그니처 #신라면 #시위 #휴가
- key #value
- JAVA #Thread #실행제어 #상태제어 #스케줄링 #sleep #join #stop #resume #suspend #yeid #interrupt #interrupred #Deprecated
- JAVA #CollectionFramework #Set #HashSet
- 정보처리기사 #가용성 #2020년개정 #오픈소스 #애플리케이션 #WAS #비즈니스 #DBMS
- 자바 #개념 #변수 #자료형
- 육회물회 #금복주류 #소메랑곱창 #금정역 #나는솔로 #맥주
- JAVA #Thread #쓰레드 #자바 #우선순위 #setPriority #getPriority
- JAVA #CollectionFramework #Stack #Queue #LinkedList #PriorityQueue #LIFO #FIFO
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |