다음 예제는 주로 두 가지 문제를 논의합니다.
질문 1. 스레드 풀의 크기가 5라고 가정하면 크기가 고정되어 있습니다. 그러면 스레드 풀에 10 개의 스레드를 넣는 작동 효과는 어떻게 작동합니까? 다른 스레드의 상태?
질문 2. 그래서 스레드 풀에서 스레드를 제거하거나 정확하게 실을 유휴 스레드로 만들 수 있습니까?
예:
package com.dada.executorservice; java.util.concurrent.timeUnit import; public class jobthread는 스레드를 확장합니다 {// 스레드 이름 공개 jobthread (문자열 이름, long ThreadId) {super (name); } @override public void run () {// 메인 스레드 에이 스레드가 포함 된 경우 (mainthread.threadnamemap.containskey (this.getname ()))) {try {system.out.println ( "스레드 이름 : -----" + this.getname ()); TimeUnit.seconds.sleep (4); } catch (예외 e) {e.printstacktrace (); }}} system.out.println ( "********************** 스레드 끝, 스레드 이름 : ***************************" + this.getName ()); }} package com.dada.executorservice; java.util.hashmap import; import java.util.concurrent.executorservice; java.util.concurrent.executors import; java.util.concurrent.timeUnit import; 공개 클래스 MainThread {public static final int threadpool_size = 5; // 고정 크기 스레드 풀 생성 공개 정적 ExecutOrservice exec = executor.NewFixedThreadPool (ThreadPool_Size); // 스레드 이름을 저장하는 데 사용되는 맵 public static map <string, string> Threadnamemap = new Hashmap <String, String> (); public static void main (String [] args) {// 스레드 풀에 10 개의 스레드를 삽입하지만 스레드 풀은 최대 5 개의 스레드 만 허용하므로 다른 5 개의 스레드는 (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 ( "해시 테이블의 크기 :" + Threadnamemap.size ()); try {System.out.println ( "메인 스레드가 잠자리에 든다!"); TimeUnit.seconds.sleep (3); } catch (예외 e) {e.printstacktrace (); System.out.println ( "Wake Up!"); } // 다음은 스레드 풀에서 스레드를 삭제하는 데 사용됩니다. // removeThread (0); // removeThread (1); // removeThread (2); } public static void removeThread (int i) {ThreadNamemap.remove (getThreadName (i)); System.out.println ( "ThreadThread" + i + ", 해시 테이블의 크기 :" + Threadnamemap.size ()); } public static String getThreadName (int i) {return "ThreadName"+i; }} 코드 결과를 직접 실행합니다.
ThreadName : ------ ThreadName0
해시 테이블의 크기 : 10
메인 스레드에서 잠자리에 든다!
ThreadName : ------ ThreadName2
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName1
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName2
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName1
ThreadName : ------ ThreadName0
ThreadName : ------ ThreadName1
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName0
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName2
ThreadName : ------ ThreadName1
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName4
결론적으로 :
인쇄 된 발견 : 스레드 이름은 ThreadName0에서 ThreadName4로, 다른 이름은 없습니다.
스레드 풀에 10 개의 스레드가 배치되지만 스레드 풀의 크기는 5이며 5 개의 스레드 만 CPU를 할당 할 수 있습니다. 실행 중 하나는 스레드 풀에 처음으로 넣고 다른 스레드는 준비 상태 (차단 상태)에 있습니다.
주석을 제거한 후 코드가 실행됩니다.
ThreadName : ------ ThreadName0
ThreadName : ------ ThreadName2
ThreadName : ------ ThreadName4
해시 테이블의 크기 : 10
메인 스레드에서 잠자리에 든다!
ThreadName : ------ ThreadName1
ThreadName : ------ ThreadName3
스레드 스레드 삭제, 해시 테이블의 크기 : 9
스레드 삭제 삭제 1, 해시 테이블의 크기 : 8
스레드 삭제 삭제 2, 해시 테이블의 크기 : 7
*************** 스레드 엔드, 스레드 이름 : ********* ThreadName2
*************** 스레드 엔드, 스레드 이름 : ********* ThreadName0
ThreadName : ------ ThreadName5
ThreadName : ------ ThreadName6
*************** 스레드 엔드, 스레드 이름 : ********* ThreadName1
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName7
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName6
ThreadName : ------ ThreadName5
ThreadName : ------ ThreadName7
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName3
ThreadName : ------ ThreadName5
ThreadName : ------ ThreadName6
ThreadName : ------ ThreadName7
ThreadName : ------ ThreadName4
ThreadName : ------ ThreadName3
결론적으로 :
결과에서 스레드를 제거하기 전에 실행 된 스레드가 여전히 Thread0에서 Thread4까지임을 알 수 있습니다. 스레드 스레드 0을 제거한 후 새 스레드 스레드 3이 실행되기 시작하고 순서대로 ThreadName7로 이동합니다.
요약은 다음과 같습니다.
1. 스레드 풀의 크기가 5라고 가정하면 크기가 고정되어 있습니다. 그러면 스레드 풀에 10 개의 스레드를 넣는 작동 효과는 어떻게 작동합니까? 다른 스레드의 상태?
에이. 스레드 풀의 개념은 요청을 계속 추진하지만 지정된 할당량으로 스레드 만 처리 할 수 있으며 추가 스레드가 대기 할 수 있다는 것입니다.
비. 스레드 중 하나가 처리가 완료되면 (비즈니스 실행이 완료되거나 루프가 종료 됨) 스레드 풀이 대기 대기열에서 작업을 자동으로 가져와 유휴 스레드를 사용하여 작업을 실행합니다. 러닝 스레드 풀의 스레드 풀은 배치 된 순서를 기준으로해야합니다.
2. 스레드 풀에서 스레드를 제거하는 방법, 또는 정확한 스레드를 유휴 스레드로 만드는 방법은 무엇입니까?
스레드 풀은 스레드 중 하나를 얻을 수없고 스레드 풀을 사용하는 메인 스레드와 기본 스레드에서 열린 스레드가 같은 레벨에 있기 때문에 다른 당사자의 생존을 지배 할 권리가 없기 때문입니다. 그러나 방법을 바꾸고 목표를 재치있는 방식으로 달성 할 수 있습니다.
에이. 기본 스레드는 해시 맵이 될 수있는 해시 테이블을 유지합니다. 핵심 값은 임의적이지만 독특해야하며 스레드를 독특하게 표시 할 수 있습니다.
비. 스레드 풀에 배치 된 모든 스레드는 키 값을 생성 한 다음이 해시 맵에 저장해야합니다.
기음. while (true)의 스레드와 같은 루프 클래스 스레드의 경우. 이 스레드의 키가 위의 해시 맵에 존재하는지 여부를 확인하기 위해 조건을 추가해야합니다. 존재하지 않으면 while 루프를 종료하십시오.
디. 메인 스레드는 다른 스레드의 생존을 지배 할 수는 없지만 자체 해시 맵을 넣거나 제거 할 수 있습니다. 이 시점에서, 해시 맵에서 스레드의 해당 키 값이 제거되는 한, 다음 번에 루프가있을 때 스레드가 자동으로 종료됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.