프로젝트에서 큰 동시성 볼륨의 성능 안정성을 향상시키기 위해 스레드 풀은 종종 멀티 스레드 비동기 작업을 수행하는 데 사용됩니다. 멀티 스레딩에는 두 가지 유형이 있습니다. 하나는 반환 값이없는 실행 가능한 인터페이스를 구현하고 다른 하나는 반환 값을 갖는 호출 가능한 인터페이스를 구현하는 것입니다.
스레드 중 하나가 시간이 초과되면 이론적으로 다른 스레드의 실행 결과에 영향을 미치지 않아야하지만 프로젝트에서 발생하는 문제는 한 스레드가 차단되고 다른 스레드에 의해 반환 된 인터페이스가 비어 있음을 나타냅니다. 실제로, 그것은 매우 간단한 질문이지만, 처음으로 그것을 만났기 때문에 나는 여전히 그것에 대해 한동안 생각했습니다. 매우 간단합니다. 차단 라인 때문입니다
프로세스는 해제되지 않으며 동시성 금액이 커지면 스레드 풀의 수가 가득 차 있으므로 다른 스레드는 대기 상태에 있습니다.
첨부 된 것은 내가 직접 쓴 디버깅 코드입니다. 문제를 생각할 수 없으면 시뮬레이션을 시뮬레이션하면 문제가 발생할 수 있습니다.
import java.util.concurrent.callable; import java.util.concurrent.executionException; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; import java.util.concurrent java.util.concurrent.timeoutexception; public class futuretest {public static void main (String [] args)은 InterruptedException, executionException, timeoutException {final executorService exec = executors.newfixedThreadPool (1); callable <string> call = new Callable <string> () {public String Call () Throws InterruptedException {// 시간 소비 작동 스레드를 실행 시작 (1000 * 2); "1 스레드 실행 완료"를 반환합니다. "; }}; callable <string> call2 = new Callable <string> () {public String Call ()은 예외를 겪습니다 {// 시간 소모적 작업 실행 // thread.sleep (1000 * 5); 반환 "2 스레드 실행이 완료되었습니다."; }}; callable <string> call3 = new Callable <string> () {public String Call ()은 예외를 겪습니다 {// 시간 소모 작업 실행 // thread.sleep (1000 * 5); 반환 "3 스레드 실행이 완료되었습니다."; }}; Future <string> future = exec.submit (call); Future <string> future3 = exec.Submit (Call3); Future <string> future2 = exec.submit (Call2); 문자열 obj = ""; 문자열 obj2 = ""; 문자열 obj3 = ""; try {obj = future.get (500, timeUnit.milliseconds); // 작업 처리 시간 초과를} // 1 초 캐치 (예외 e) {System.out.println ( "Processing Timeout ....")으로 설정합니다. e.printstacktrace (); } try {obj3 = future3.get (3000, timeUnit.milliseconds); // 작업 처리 시간 초과를} // 1 초 캐치 (예외 e) {System.out.println ( "Processing Timeout ......")으로 설정합니다. e.printstacktrace (); } try {obj2 = future2.get (3000, timeUnit.milliseconds);} catch (예외 e) {System.out.println ( "Processing Timeout ...."); e.printstacktrace (); } system.out.println ( "3 작업이 성공적으로 반환됩니다 :" + obj3); System.out.println ( "2 작업이 성공적으로 반환됩니다 :" + obj2); System.out.println ( "1 작업이 성공적으로 반환됩니다 :" + obj); exec.shutdown (); }}위의 것은 Java의 비동기 멀티 스레딩 타임 아웃으로 인한 서비스 예외에 대한 간단한 논의입니다. 모두가 wulin.com을 더 지원하기를 바랍니다