Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ElasticSearch 토큰필터
- 동의어 파일
- 안드로이드스튜디오
- Spring Servlet이란
- layout
- 안드로이드
- Servlet 멀티 스레딩
- ElasticSearch NGram
- 자바
- ElasticSearch 동의어 파일
- ApplicationContext란
- 인텔리제이
- H2
- elasticSearch
- Servlet Container란
- Servlet과 Thread
- Servlet Life Cycle
- ContextLoaderListener란
- ElasticSearch EdgeNGram
- Bean Factory란
- Spring Handler
- H2 DB
- ElasticSearch 동의어 사전
- Java
- spring 장점
- ElasticSearch Shingle
- 계산기
- Spring Container란
- Dispathcher Servlet이란
- 토큰필터
Archives
- Today
- Total
결국 무엇이든 해내는 사람
Day 14 - 쓰레드를 이용하여 동기화를 수행해보자 (Syncronized) 본문
반응형
package Thread_EggGame;
public class Egg_Box {
int egg_count=0;
int packed_egg=0;
}
에그 박스를 만든다. 이는 거위(스레드 한개) 와 주인장(스레드 한개) 총 두개의 스레드가 공유할 영역이다.
package Thread_EggGame;
public class Duck extends Thread {
Egg_Box eggBox;
@Override
public void run() {
while (true) {
synchronized (eggBox) {
eggBox.egg_count += 1;
System.out.println("달걀의 개수 : " + eggBox.egg_count);
}
try {
Thread.sleep(2000);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
package Thread_EggGame;
import java.util.Scanner;
public class Duck_Owner extends Thread {
Egg_Box eggBox;
Scanner sc = new Scanner(System.in);
int countSec = 0;
String input = " ";
@Override
public void run() {
while (true) {
if (sc.nextLine() != null) {
System.out.println("HIHIHIHI");
synchronized (eggBox) {
System.out.println("달걀을 모두 회수합니다.");
eggBox.packed_egg += eggBox.egg_count;
eggBox.egg_count = 0;
System.out.println("---------------------------");
System.out.println("남은 달걀 : " + eggBox.egg_count);
System.out.println("포장된 달걀 : " + eggBox.packed_egg);
System.out.println("---------------------------");
try {
Thread.sleep(7000);
} catch (Exception e) {
System.out.println(e);
}
//이거 syncronized 할때, try catch문 사용시 , sleep 에만 사용해주는게좋음
//try 안에다가 싱크로나이즈 싹다 넣고 막 돌렸더니, 다른 클래스의 싱크로나이즈와 충돌발생
}
}
}
}
}
시원하게 쓰레드 작성
이때 동기화를 통해서 에그박스 공통영역 접근을 제한한다
중요한건 동기화시 try catch문을 sleep을 쓰려고 사용하였다가 낭패를 봄
트라이 캐치문은 깔끔하게 sleep만 제어해주도록 해보자 .. 이유는 아마 충돌이 나나봄
package Thread_EggGame;
public class main_egg {
public static void main(String[] args) {
Egg_Box eggBox=new Egg_Box();
Duck duck = new Duck();
Duck_Owner duck_owner = new Duck_Owner();
duck.eggBox=eggBox;
duck_owner.eggBox=eggBox;
duck.start();
duck_owner.start();
}
}
간단 정리
synchronized가 있으면
synchronized(share) {}
중괄호 안을 수행하는 동안 share라는 범위의 자원을 건들지말라는 뜻
그니까 다른 프로세스가 share에 접근하려고하면 중괄호 내용 수행이 끝날때까지 대기상태에 들어가는것
자바에서 지원하는 Synchronized 키워드는 여러개의 스레드가 한개의 자원을 사용하고자 할 때,
현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념
반응형
'두서없는 공부 노트 > JAVA' 카테고리의 다른 글
Day 15 - frame 응용, 도형그리기 ,움직이기 (0) | 2020.09.03 |
---|---|
Day 15 - 자바 Frame을 이용하여 화면 중앙에 창 띄우기, 도형 , 선 그리기 (0) | 2020.09.03 |
Day 14 - 은행계좌를 이용한 간단한 쓰레드 예제 (0) | 2020.09.02 |
Day 14 - 쓰레드 2개를 이용한 게임응용 (0) | 2020.09.02 |
Day 13 - 쓰레드와 Volatile (0) | 2020.09.02 |
Comments