Loading the catalog…
Loading the catalog…
Thread 상태 : 생성, 준비, 실행, 대기, 종료 NEW ** 스레드 객체 생성, 실행 시작 X start() 로 스레드 시작되어 RUNNABLE 상태로 넘어감 * RUNNABLE * 실행 준비 완료 상태, CPU 스케줄링 기다리는 중 **RUNNING 스케줄러가 스레드를 골라 CPU를 할당하면 실제로 실행 yield() 는 실행 가능한 다른 스레드에게 실행을 양보할 수 있음 WAITING 실행 중인 스레드는 항상 CPU를 사용하는 것은 아니고, 실행 상태에서 빠져나와 대기 상태가 될 수 있음 TIMED_WAITING : 시간이 정해져 있는 대기 상태 sleep() 일정 시간 동안 기다림 WAITING : 언제 끝날지 알 수 없는 대기 상태 wait() 기다림 notify() 기다리는 스레드 하나를 깨움 notifyAll() 기다리는 스레드들을 깨움 join() 다른 스레드가 끝나는 것을 기다림 BLOCKED 내가 필요한 lock을 다른 스레드가 사용하고 있을 때, 다른 스레드가 lock을 놓을 때까지 기다림 → lock은 무엇인가... 멀티스레드에서 여러 스레드가 데이터를 동시에 건드리지 못하게 막는 잠금장치 / synchronized 영역에 들어가려고 하면, lock 필요 TERMINATED 실행 중인 run()의 코드가 전부 끝나서 스레드의 실행이 종료됨 ❋ 한 번 종료된 스레드 객체는 start() 를 통해 다시 시작할 수 없다! 다시 시작하려면 새로운 객체를 만들어야 함... Thread 동기화 (Synchronization) 멀티스레드 작성 시 주의할 것 다수의 스레드가 공유 데이터에 동시에 접근하는 경우 스레드 동기화 : 공유 데이터의 동시 접근 문제 해결 공유 데이터에 동시에 접근하는 다수의 스레드가 공유 데이터를 배타적으로 접근하기 위해서 상호 협력한다 - 공유 데이터를 접근하는 모든 스레드를 한 줄로 세우고, 한 스레드가 공유 데이터에 대한 작업을 끝낼 때까지 다른 스레드가 대기 하도록 한다! 자바에서 스레드 동기화를 위한 방법 synchronized 동기화 블록 지정 → 한 스레드가 독점 실행해야 하는 임계 영역을 지정하고, 한 번에 하나의 스레드만 공유 데이터에 접근할 수 있도록 제어한다 wait()-notify() 메소드로 스레드 실행 순서 제어 Lab #5 MyBank 출력문을 제거하고 아무리 돌려봐도 오류발생! 메시지가 안 떠서... sleep time도 2로, 스레드 개수도 5개로, 반복 횟수도 10000번으로 바꾸었더니 드디어 오류발생! 메시지가 떴다 ᄒ... 출력문 추가 후 오류발생 없이 잘 돌아가는 것처럼 보이는 것도 확인할 수 있었다 콘솔 출력이 내부적으로 synchronization 되어 있기 때문에 실행 흐름을 정렬할 수도 있다, (스레드 실행 타이밍 자체가 달라짐) 하지만 여전히 코드가 synchronized 되어있는 것은 아니기 때문에 race-condition 이 발생할 수 있는 환경에 노출되어 있다 ❋ race-condition : 여러 스레드가 공유 데이터에 동시에 접근할 때 누가 먼저 실행되느냐에 따라 결과가 달라지는 현상 이게 어떤 식의 문제를 발생시키냐면, balance가 0인 상태를 읽어서 스레드1에서도 입금을 하고 스레드2에서도 입금을 했다면 balance는 20000이 되어야 하는데 각각 balance를 10000으로 내보내서 balance가 10000이 될 수도 있는... 상황이다 이런 식으로 synchronized 를 붙여줌으로써 방금 말한 문제를 해결할 수 있다 이러면 한 순간에 하나의 스레드만 허용된다 ❋ 그리구 synchronized의 위치는 접근제어자와 리턴 형식 사이임을 기억하도록 하자^..^;;!! Lab #6 FamilyAccount BankAccountV1은 balance라는 데이터를 공유하고 있음 deposit(), withdraw() 둘다 balance를 수정하는 기능을 가지고 있음 따라서 동시에 접근하지 못하도록 synchronized를 사용함 ⇒ 공유 자원 데이터 보호 위에서 말했던 BLOCKED 상태와 연관지을 수 있음 이 버전은 synchronized 사용에서 나아가서, wait()/notifyAll() 을 사용해서 입출금이 번갈아 실행되도록 만들고 있다 empty = 입출금 순서를 제어 하는 flag로 사용 → deposit : !empty가 true이면 기다리고, empty이면 돈을 넣고 empty를 false로 바꾼다 → withdraw : empty가 true이면 기다리고, !empty이면 돈을 빼고 empty를 true로 바꾼다 그러면 동작할 때마다 empty의 true/false가 달라지니까 입금 뒤에는 출금이, 출금 뒤에는 입금이 나올 수밖에! Lab #7 아기돼지삼형제 join()을 통해 호출한 곳(Main)에서 해당 스레드(pig1, pig2, pig3)가 완료될 때까지 기다리게 한다 그래서 모두 다 도착하고 엄마 돼지가 문을 열 수 있는 것이다 또한 여기서도 역시 start()를 pig1, pig2, pig3 순서대로 썼어도 실제로 실행되는 것은 정해지지 않는다는 걸 다시 한 번 확인할 수 있다 Math.random() : 0 이상 1 미만의 실수를 랜덤으로 만드는 것 ❋ try-catch문은 왜 있는 것? sleep()과 join()은 스레드를 기다리게 만드는 메소드이고, 기다리는 도중 interrupt()를 받을 수 있어서 InterruptedException을 처리해야 한다!
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[Java] Thread (2). Thread 상태 : 생성, 준비, 실행, 대기, 종료 NEW ** 스레드 객체 생성, 실행 시작 X start() 로 스레드 시작되어 RUNNABLE 상태로 넘어감 * RUNNABLE * 실행 준비 완료 상태, CPU 스케줄링 기다리는 중 **RUNNING 스케줄러가 스레드를 골라 CPU를 할당하면 실제로 실행 yield() 는 실행 가능한 다른 스레드에게 실행을 양보할 수 있음 WAITING 실행 중인 스레드는 항상 CPU를 사용하는 것은 아니고, 실행 상태에서 빠져나와 대기 상태가 될 수 있음 TIMED_WAITING : 시간이 정해져 있는 대기 상태 sleep() 일정 시간 동안 기다림 WAITING : 언제 끝날지 알 수 없는 대기 상태 wait() 기다림…
Open source