자바 고급문법 세번째 Thread
코어가 요리사
스레드는 화구
(원코어 원스레드)
코어가 하나면 실질적으로는 여전히 한 번에 하나의 작업만 가능하지만 번갈아가면서 이 요리 저 요리 왔다리갔다리 하는거임 job scheduling에 따라서
스레드가 모두 같은속도로 실행되지 않음
숫자가 낮을 수록 우선순위가 떨어짐
(main = 5)
Thread 안에 '파라미터로 받은거 실행하셈' 있음
--> 원래 Runnable interface를 trigger하는 것이 목적
다중스레드 (multi thread)
문제가 생기기도 함, 같은 자원을 동시에 건들임(동기화 문제) 화장실 안에 있는데 문여는거... --> 문잠그자 synchronized⭐ (안정성 확보)
synchronized void add(int m) 이렇게 써줌
동기화의 목적 = 같은 놈을 두 놈이 건들일까봐 막는거
근데 t0가 끝날때까지 t1은 모함
아무것도 알려주지도 않고 그냥 멈춰있는거임
그래서 일단 안내 먼저 하고 동기화를 해보자 메소드 전체에 싱크로나이즈드 하지말고
동기화 블럭 쓰기
괄호안에는 동기화로부터 보호할 객체 쓰고
블럭 안에는 동기화할 거 씀
synchronized (this) {
System.out.println(name + " - 현재 잔액 : " + money);
money += m;
//전산처리 시간을 가정하여 임의 코드 작성
for(long i = 0; i < 50000000000L; i++) {
new String("time");
}
}
Thread-1 - 입금작업을 시작합니다.
Thread-0 - 입금작업을 시작합니다.
Thread-1 - 현재 잔액 : 0
Thread-1 - 입금 후 잔액 : 100
Thread-0 - 현재 잔액 : 100
Thread-0 - 입금 후 잔액 : 200
이렇게 쓰면 안내는 둘 다 먼저 받고 이전 스레드가 끝날때까지 다음 스레드 대기~~~
스레드는 동시에 작업하는게 장점인데 싱크로나이즈 남발하면 쓰는 이유 없어짐 현업에서는 동기화 안하고 쓰고 필요한 경우에 개발자가 직접 건들임 유의하자요
유용한 기능
1 sleep()
2 join()
3 yield() 양보
------------------- 아래 애들은 Thread꺼 아니고 Object꺼임
4 wait() non timed
5 notify() 웨잇이 멈추면 얘가 깨움 공지~~~ 호외요~~~~
스레드는 일회용 run()이 끝나면 퇴근하도록 근로계약서 씀ㅇㅇ 일 또 못시킴
스레드 "저 run() 안에 있는거만 하고 집 갈거임"
그래서 하나 더 불러서 쓰면 앞에 있는 애가 하는 동안 다음애가 같은거 또 하고 있음 ㅇㄴ
그럼 계약서 맹점 이용 ㄱㄱ
run()에다가 while 반복문 돌려버림 참일때까지 뺑이
사장 "ㅅㄱ~"
그래도 사람인데 집에 보내주자
.stop() 쓰면 스레드놈 타이어 꼽다가 집가버림 --> 리소스 찌꺼기 남음
그럼 타이어 두개 꼽혀있는건 어떻게 할거임!! 그래서 사용하지않는것을 권장, 안드로이드는 쓰면 다운됨
한 사이클의 작업을 끝내고 while이 참일 경우에 작업 다시 함
그럼 while문 종료 --> boolean값을 거짓 대입
(isRun이라고 치면 나옴)
근데 객체지향에서 이것도 권장하는 방식이 아니에요
그래서 스레드에 스레드종료시키는 (while문 조건 거짓으로 만드는) 메소드 만들고
필요할때 메인에서 호출해서 끝내기