아이를위한 ExecutorService를 자바 스레드 풀 스레드 대기 완료 후 처리를 계속하기 위해 메인 스레드를 얻을 수 있습니다

자세한 내용은 스레드를 방문 www.itkc8.com을

풀 도구 스레드 :

java.util.concurrent의를 가져옵니다. *;

Public 클래스 CommonThreadPool {
    개인 정적 간부 ExecutorService를 사용해, 새로운 ThreadPoolExecutor = (50, 100, 0L,
        ) 10000 (<Runnable를> TimeUnit.MILLISECONDS 새로운 LinkedBlockingQueue 등,
        새로운 ThreadPoolExecutor.CallerRunsPolicy ());

    공공 정적 무효 실행 (명령의 Runnable) {
        exec.execute (커맨드);
    }

    // 하위 스레드 실행하는 Future.get 끝 ()는 null이 완료되지 않을 경우, 메인 스레드가 기다리고 차단합니다
    ; 공공 정적 미래 (실행 가능한 명령)을 제출 {반환 exec.submit (명령)}
    자식 스레드를 반환 // 미래에 반환 된 값에서 얻을 수 있습니다 :하는 Future.get ();
    공공 정적 미래 (주는, Callable 명령) {제출
        반환 exec.submit (명령);
    }
}

테스트 클래스를 :

수입 인 java.util.ArrayList;
수입은 java.util.List;
수입 java.util.concurrent.ExecutionException;
수입 java.util.concurrent.Future;

공용 클래스 ThreadTest로 {

    @Test
    공공 무효을 ThreadTest () {

        목록 <미래> futureList = 새로운 ArrayList를 <> ();
        경우 (나는 <4] I = 0 int로 난 ++) {
            INT finalI = 1;
            미래의 미래 = CommonThreadPool.submit (() -> {
                {시도
                    에서 System.out.println (finalI + "我执行了...");
                    에 Thread.sleep (5000L)
                    에서 System.out.println (finalI + "我执行完了... ");

                } 캐치 (예외 : InterruptedException 전자) {
                    e.printStackTrace ();
                }
            });
            futureList.add (미래);
        }

        뭔가에 // 메인 스레드 작업, 자식 스레드가 비동기 적으로 실행 할 수 있습니다.
        MainThreadOtherWork ();
        에서 System.out.println을 ( "서브 이제 스레드 완료를 기다리는 중입니다.");
        // 메인 스레드 다른 작업이 완료, 아이 thread의 종료를 기다리고, 전화 방법하는 Future.get () 계열 일 수있다.
        //

        {은 try
            (미래 미래 : futureList)에 대한 {
                에서 System.out.println (하는 Future.get ());
            }
        } 캐치 (예외 : InterruptedException | ExecutionException E) {
            e.printStackTrace ();
        }
        은 try {
            에서 System.out.println ( "처리 가. ");
            에 Thread.sleep (1000)
            에서 System.out.println ("두 개의 프로세스 ");
            에 Thread.sleep (1000)
            에서 System.out.println ("처리 세 ");
            에 Thread.sleep (1,000 )
            에서 System.out.println ( "네 방법.");
            에 Thread.sleep (1000)
            에서 System.out.println ( "모든 처리가 완료된다.");

        } 캐치 (예외 : InterruptedException 전자) {
            e.printStackTrace ();
        }
    }

    정적 무효 mainThreadOtherWork 비공개 () {
        에서 System.out.println는 ( "메인 쓰레드가 작동하기");
        은 try {
            에 Thread.sleep (2000L)를;
        } 캐치 (예외 : InterruptedException E) {
            e.printStackTrace를 ();
        }
        에서 System.out.println을 ( ;) "메인 스레드 완료"
    }

}

결과 :

주 스레드는 작업을 시작
내가 수행 0. . .
2 내가 수행. . .
3 내가 수행. . .
1 내가 수행. . .
메인 스레드가 작업을 완료
자식 스레드 기다립니다.
2 내가 실행을 완료했다. . .
3 나는 실행을 완료했다. . .
(1) 나는 실행을 완료했다. . .
0 나는 실행을 완료했다. . .




프로세스가.
티탄. 처리
가공 III.
처리 IV.
모든 처리가 완료된다.
 

추천

출처blog.csdn.net/HUXU981598436/article/details/90446029