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에서 라인에 대응하는 키 값을 제거하면, 이 라인은 다음 순환할 때 자동으로 종료됩니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기