자바 스 레 드 상태 와 깨 우기 메커니즘 과 스 레 드 탱크 의 실현 을 기다 리 고 있 습 니 다.
7467 단어 Java스 레 드 상태대기 각성 메커니즘
스 레 드 는 모두 6 중 상태 로 서로 전환 할 수 있 습 니 다.
깨 우기 사례 대기(스 레 드 간 통신)
실현:
깨 우기 대기 사례:스 레 드 간 통신
고객 스 레 드 만 들 기(소비자):사장 이 원 하 는 만두 의 종류 와 수량 을 알려 주 고 wait 방법 을 사용 하여 cpu 의 실행 을 포기 하고 WAITING 상태 로 들 어 갑 니 다(무한 대기)
사장 스 레 드 만 들 기(생산자):5 초 동안 만 두 를 만 들 고 만 두 를 만 든 후에 notify 방법 으로 고객 에 게 만 두 를 먹 으 라 고 깨 웠 습 니 다.
주의:
고객 과 사장 스 레 드 는 동기 코드 블록 으로 감 싸 야 합 니 다.대기 와 깨 우기 가 한 개 만 실 행 될 수 있 도록 해 야 합 니 다.
동기 화 된 잠 금 대상 은 유일 해 야 합 니 다.
잠 금 대상 만 wait 와 notify 방법 을 호출 할 수 있 습 니 다.
Obejct 클래스 의 방법
void wait()
다른 스 레 드 에서 이 대상 의 notify()방법 이나 notify All()방법 을 호출 하기 전에 현재 스 레 드 가 기 다 립 니 다.
void notify()
이 대상 모니터 에서 기다 리 는 단일 스 레 드 를 깨 웁 니 다.
wait 방법 을 계속 실행 한 다음 코드 입 니 다.
TimeWaiting(타이머 대기)에 들 어 가 는 방법 은 두 가지 가 있 습 니 다.
1.sleep(long m)방법 을 사용 하여 밀리초 값 이 끝 난 후 스 레 드 가 잠 에서 깨 어 Runnable/Blocked 상태 로 들 어 갑 니 다.
2.wait(long m)방법 을 사용 합 니 다.wait 방법 은 밀리초 값 이 끝 난 후에 도 notify 에 의 해 깨 어 나 지 않 으 면 자동 으로 깨 어 납 니 다.스 레 드 는 잠 에서 깨 어 Runnable/Blocked 상태 로 들 어 갑 니 다.
깨 우 는 방법:
void notify()이 대상 모니터 에서 기다 리 는 단일 스 레 드 를 깨 웁 니 다.
void notify All()이 대상 모니터 에서 기다 리 는 모든 스 레 드 를 깨 웁 니 다.
public static void main(String[] args) {
// ,
final Object obj = new Object();
// ( )
new Thread(){
@Override
public void run() {
//
while(true){
// ,
synchronized (obj){
System.out.println(" 1 ");
// wait , cpu , WAITING ( )
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//
System.out.println(" , 1 !");
System.out.println("---------------------------------------");
}
}
}
}.start();
// ( )
new Thread(){
@Override
public void run() {
//
while(true){
// ,
synchronized (obj){
System.out.println(" 2 ");
// wait , cpu , WAITING ( )
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//
System.out.println(" , 2 !");
System.out.println("---------------------------------------");
}
}
}
}.start();
// ( )
new Thread(){
@Override
public void run() {
//
while (true){
// 5
try {
Thread.sleep(5000);// 5
} catch (InterruptedException e) {
e.printStackTrace();
}
// ,
synchronized (obj){
System.out.println(" 5 , , ");
// , notify ,
//obj.notify();// ,
obj.notifyAll();//
}
}
}
}.start();
}
2.깨 우기 메커니즘 을 기다린다
한 스 레 드 에서 규정된 작업 을 한 후에 대기 상태(wait()에 들 어가 다른 스 레 드 가 지정 한 코드 를 실행 한 후에 notify()를 깨 우 는 것 입 니 다.여러 스 레 드 가 기다 리 고 있 을 때 필요 하 다 면 notify All()을 사용 하여 모든 대기 스 레 드 를 깨 울 수 있 습 니 다.wait/notify 는 스 레 드 간 의 협력 체제 이다.
각성 을 기다 리 는 방법:
스 레 드 탱크 는 여러 개의 스 레 드 를 수용 하 는 용기 입 니 다.그 중의 스 레 드 는 반복 적 으로 사용 할 수 있 고 스 레 드 대상 을 자주 만 드 는 작업 을 줄 일 수 있 으 며 스 레 드 를 반복 적 으로 만 들 지 않 아 도 너무 많은 자원 을 소모 할 수 있 습 니 다.
자바 안의 스 레 드 탱크 의 최상 위 인 터 페 이 스 는
java.util.concurrent.Executor
이지 만 엄격 한 의미 에서 Executor
은 스 레 드 탱크 가 아니 라 스 레 드 를 실행 하 는 도구 일 뿐이다.진정한 스 레 드 탱크 인 터 페 이 스 는 java.util.concurrent.ExecutorService
이다.스 레 드 탱크 를 배치 하 는 것 은 비교적 복잡 하 다.특히 스 레 드 탱크 의 원리 가 명확 하지 않 은 상황 에서 배치 할 수 있 는 스 레 드 탱크 가 비교적 좋 지 않 기 때문에 java.util.concurrent.Executors
스 레 드 공장 류 에서 정적 공장 을 제공 하여 자주 사용 하 는 스 레 드 탱크 를 생 성 했다.공식 적 으로 Executors 프로젝트 클래스 를 사용 하여 스 레 드 탱크 대상 을 만 들 것 을 건의 합 니 다.사용:
채널:JDK 1.5 이후 제공 되 는
java.util.concurrent.Executors:스 레 드 탱크 의 공장 류,스 레 드 탱크 생 성
Executors 클래스 의 정적 방법:
static ExecutorService newFixedThreadPool(int nThreads)고정 스 레 드 수 를 다시 사용 할 수 있 는 스 레 드 풀 을 만 듭 니 다.
인자:
int nThreads:스 레 드 탱크 에 포 함 된 스 레 드 수량 만 들 기
반환 값:
ExecutorService 인 터 페 이 스 는 ExecutorService 인터페이스의 실현 대상 을 되 돌려 줍 니 다.저 희 는 ExecutorService 인 터 페 이 스 를 사용 하여 수신 할 수 있 습 니 다(인터페이스 프로 그래 밍)
java.util.concurrent.Executor 서비스:스 레 드 탱크 인터페이스
스 레 드 탱크 에서 스 레 드 를 가 져 오고 start 방법 을 호출 하여 스 레 드 작업 을 수행 합 니 다.
submit(Runnable task)실행 에 사용 할 Runnable 작업 제출
스 레 드 풀 을 닫 거나 없 애 는 방법
void shutdown()
스 레 드 탱크 의 사용 절차:
1.스 레 드 탱크 의 공장 류 Executors 에서 제공 하 는 정적 방법 new Fixed ThreadPool 을 사용 하여 지정 한 스 레 드 수량의 스 레 드 탱크 를 생산 합 니 다.
2.클래스 를 만 들 고 Runnable 인 터 페 이 스 를 실현 하 며 run 방법 을 다시 쓰 고 스 레 드 작업 을 설정 합 니 다.
3.ExecutorService 의 방법 submit 를 호출 하여 스 레 드 작업(실현 클래스)을 전달 하고 스 레 드 를 켜 고 run 방법 을 실행 합 니 다.
4.ExecutorService 의 방법 shutdown 을 호출 하여 스 레 드 풀 을 제거 합 니 다(실행 을 권장 하지 않 음)
예:
public class RunnableImpl implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" ");
}
}
public static void main(String[] args) {
//1. Executors newFixedThreadPool
ExecutorService es = Executors.newFixedThreadPool(2);
//3. ExecutorService submit, ( ), , run
es.submit(new RunnableImpl());//pool-1-thread-1
// , , ,
es.submit(new RunnableImpl());//pool-1-thread-1
es.submit(new RunnableImpl());//pool-1-thread-2
//4. ExecutorService shutdown ( )
es.shutdown();
es.submit(new RunnableImpl());// , ,
}
자바 스 레 드 상태 와 깨 우기 메커니즘 과 스 레 드 풀 의 실현 을 기다 리 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 스 레 드 상태 와 깨 우기 메커니즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 을 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.