java ExecutorService 사용 방법 상세 정보
5360 단어 javaExecutorService
질문 1.스레드 탱크의 고정 크기는 5로 가정합니다.그러면 스레드 탱크에 10개의 스레드를 넣으면 운행 효과가 어떻습니까?다른 라인의 상태?
문제그러면 어떻게 스레드 탱크에서 어떤 스레드를 제거합니까? 정확히 말하면 어떤 스레드를 빈 스레드로 만듭니까?
예:
package com.dada.executorService;
import java.util.concurrent.TimeUnit;
public class JobThread extends Thread {
//
public JobThread(String name,long threadId) {
super(name);
}
@Override
public void run() {
//
while (MainThread.threadNameMap.containsKey(this.getName())) {
try {
System.out.println(" :-----" + this.getName());
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("*************** , :*********" + this.getName());
}
}
package com.dada.executorService;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainThread {
public static final int THREADPOOL_SIZE = 5;
//
public static ExecutorService exec = Executors.newFixedThreadPool(THREADPOOL_SIZE);
// map
public static Map<String, String> threadNameMap = new HashMap<String, String>();
public static void main(String[] args) {
// 10 , 5 , 5
for (int i = 0; i < THREADPOOL_SIZE + 5; i++) {
String threadName = getThreadName(i);
threadNameMap.put(threadName, threadName);
exec.execute(new JobThread(threadName, i));
}
System.out.println("Hash Size:" + threadNameMap.size());
try {
System.out.println(" !");
TimeUnit.SECONDS.sleep(3);
} catch (Exception e) {
e.printStackTrace();
System.out.println(" !");
}
//
//removeThread(0);
//removeThread(1);
//removeThread(2);
}
public static void removeThread(int i) {
threadNameMap.remove(getThreadName(i));
System.out.println(" Thread" + i + ", Hash Size:" + threadNameMap.size());
}
public static String getThreadName(int i) {
return "threadname"+i;
}
}
코드 직접 실행 결과:스레드 이름: -----threadname0
Hash 시계의 크기: 10
메인 라인에서 좀 자!
스레드 이름: -----threadname2
스레드 이름: -----threadname4
스레드 이름: -----threadname1
스레드 이름: -----threadname3
스레드 이름: -----threadname4
스레드 이름: -----threadname2
스레드 이름: -----threadname3
스레드 이름: -----threadname1
스레드 이름: -----threadname0
스레드 이름: -----threadname1
스레드 이름: -----threadname3
스레드 이름: -----threadname0
스레드 이름: -----threadname4
스레드 이름: -----threadname2
스레드 이름: -----threadname1
스레드 이름: -----threadname3
스레드 이름: -----threadname4
결론:
인쇄된 것을 발견했습니다. 스레드 이름은threadname 0에서threadname 4까지 계속되었습니다. 다른 이름은 없습니다.
이로써 증명: 스레드 탱크에 10개의 스레드를 넣지만 스레드 탱크의 크기는 5이고 5개의 스레드에만 CPU를 분배할 수 있다. 운행하는 것은 가장 먼저 스레드 탱크에 넣은 5개의 스레드이고 다른 스레드는 모두 준비 상태(막힌 상태)이다.
주석을 제거한 후 코드 실행 결과:
스레드 이름: -----threadname0
스레드 이름: -----threadname2
스레드 이름: -----threadname4
Hash 시계의 크기: 10
메인 라인에서 좀 자!
스레드 이름: -----threadname1
스레드 이름: -----threadname3
스레드 삭제Thread0, Hash 테이블의 크기: 9
스레드 삭제Thread1, Hash 테이블의 크기: 8
스레드 삭제Thread2, Hash 테이블의 크기: 7
*** *** 스레드 종료, 스레드 이름: *** *** threadname2
*** *** 스레드 종료, 스레드 이름: *** *** threadname0
스레드 이름: -----threadname5
스레드 이름: -----threadname6
*** *** 스레드 종료, 스레드 이름: *** *** threadname1
스레드 이름: -----threadname4
스레드 이름: -----threadname7
스레드 이름: -----threadname3
스레드 이름: -----threadname6
스레드 이름: -----threadname5
스레드 이름: -----threadname7
스레드 이름: -----threadname4
스레드 이름: -----threadname3
스레드 이름: -----threadname5
스레드 이름: -----threadname6
스레드 이름: -----threadname7
스레드 이름: -----threadname4
스레드 이름: -----threadname3
결론:
결과에서 알 수 있듯이 라인을 제거하기 전에 실행되는 라인은thread0에서thread4까지입니다.스레드thread0을 제거하면 새 스레드thread3가 실행되고 순서대로threadname7로 이동합니다.
요약은 다음과 같습니다.
1. 스레드 탱크의 고정 크기, 가령 5.그러면 스레드 탱크에 10개의 스레드를 넣으면 운행 효과가 어떻습니까?다른 라인의 상태?
a. 스레드 탱크의 개념은 당신이 그 중push에 끊임없이 요청하는 것입니다. 그러나 규정된 한도의 스레드만 처리할 수 있고 나머지 스레드는 그 중에서 기다릴 수 있습니다.
b. 그 중 하나의 스레드 처리가 끝나거나(업무 수행이 끝나거나while 순환을 종료하면) 스레드 탱크는 자동으로 대기 대기열에서 작업을 꺼내서 빈 스레드를 사용하여 이 작업을 실행합니다.운행 스레드 탱크 중 어느 것이 예에서 볼 때 넣은 선후 순서에 따라 왔을 것이다.
2. 그러면 어떻게 스레드 탱크에서 어떤 스레드를 제거합니까? 정확히 말하면 어떤 스레드를 빈 스레드로 만듭니까?
스레드 탱크는 그 중의 어떤 스레드를 얻고 그를 죽일 수 없다. 왜냐하면 스레드 탱크의 메인 스레드와 메인 스레드를 사용하여 켜진 스레드는 평급이기 때문에 누구도 다른 측의 존망을 지배할 권리가 없기 때문이다.하지만 다른 방식으로 완곡하게 목적을 달성할 수 있다.
a. 메인 라인은 Hash 테이블을 HashMap으로 유지할 수 있습니다.키 값은 임의이지만, 유일하게, 유일하게 하나의 라인을 표시할 수 있습니다.
b. 스레드 풀에 넣은 모든 스레드는 키 값을 생성하고 이 HashMap에 저장합니다.
c. 순환류의 라인, 예를 들어while (true)의 라인.이 라인의 키가 위의 HashMap에 존재하는지 확인하기 위한 조건을 추가해야 합니다.존재하지 않으면while 순환을 종료합니다.
d. 주 스레드는 다른 스레드의 존망을 지배할 수 없지만 자신의 HashMap을put 또는remove 조작을 할 수 있습니다.여기서, HashMap에서 라인에 대응하는 키 값을 제거하면, 이 라인은 다음 순환할 때 자동으로 종료됩니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.